首页 > 编程语言 > 详细

javaEE(5)_JSP

时间:2015-11-21 13:08:51      阅读:218      评论:0      收藏:0      [点我收藏+]

一、什么是JSP

1、JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术,只用JSP就可以开发动态web资源

2、为什么JSP技术也是一种动态web资源的开发技术?

答:因为JSP技术允许在页面中嵌套java代码,以产生动态数据,并且web服务器在执行jsp时,web服务器会传递web开发相关的对象给jsp,jsp通过这些对象,可以与浏览器进行交互,所以jsp当然也是一种动态web资源开发技术。

3、强调一个概念:对现在的用户而言,认为通过浏览器看到的东西都是网页。但我们程序员心里要清楚,开一个浏览器访问网页,这些网页有可能是一个html页面(即静态web资源),也有可能是一个动态web资源(即servlet或jsp程序输出的)。

4、JSP这门技术的最大的特点在于,写jsp就像在写html,但:
•它相比html而言,html只能为用户提供静态数据,而Jsp技术允许在页面中嵌套java代码,为用户提供动态数据。
•相比servlet而言,servlet很难对数据进行排版,而jsp除了可以用java代码产生动态数据的同时,也很容易对数据进行排版。
5、Jsp快速入门:在jsp页面中输出当前时间。观察jsp编译后的class文件,发现其实jsp就是servlet,jsp中嵌套的java代码会原封不动的放到JSP的service方法中。打印日期的jsp页面和编译后class源码:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" import="java.util.Date"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    <%
        Date date = new Date();
    %>
    <%= date %>
</body>
</html>
技术分享
package org.apache.jsp.jsp;

import java.io.IOException;
import java.util.Date;
import java.util.Map;
import javax.el.ExpressionFactory;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.jsp.JspApplicationContext;
import javax.servlet.jsp.JspFactory;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.SkipPageException;
import org.apache.jasper.runtime.HttpJspBase;
import org.apache.jasper.runtime.InstanceManagerFactory;
import org.apache.jasper.runtime.JspSourceDependent;
import org.apache.tomcat.InstanceManager;

public final class NewFile_jsp extends HttpJspBase
  implements JspSourceDependent
{
  private static final JspFactory _jspxFactory = JspFactory.getDefaultFactory();
  private static Map<String, Long> _jspx_dependants;
  private ExpressionFactory _el_expressionfactory;
  private InstanceManager _jsp_instancemanager;

  public Map<String, Long> getDependants()
  {
    return _jspx_dependants;
  }

  public void _jspInit() {
    this._el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
    this._jsp_instancemanager = InstanceManagerFactory.getInstanceManager(getServletConfig());
  }

  public void _jspDestroy()
  {
  }

  public void _jspService(HttpServletRequest request, HttpServletResponse response)
    throws IOException, ServletException
  {
    JspWriter out = null;

    JspWriter _jspx_out = null;
    PageContext _jspx_page_context = null;
    try
    {
      response.setContentType("text/html; charset=UTF-8");
      PageContext pageContext = _jspxFactory.getPageContext(this, request, response, 
        null, true, 8192, true);
      _jspx_page_context = pageContext;
      pageContext.getServletContext();
      pageContext.getServletConfig();
      pageContext.getSession();
      out = pageContext.getOut();
      _jspx_out = out;

      out.write("\r\n");
      out.write("<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\r\n");
      out.write("<html>\r\n");
      out.write("<head>\r\n");
      out.write("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\r\n");
      out.write("<title>Insert title here</title>\r\n");
      out.write("</head>\r\n");
      out.write("<body>\r\n");
      out.write("\t");

      Date date = new Date();

      out.write(13);
      out.write(10);
      out.write(9);
      out.print(date);
      out.write("\r\n");
      out.write("</body>\r\n");
      out.write("</html>");
    } catch (Throwable t) {
      if (!(t instanceof SkipPageException)) {
        out = _jspx_out;
        if ((out != null) && (out.getBufferSize() != 0)) try {
            out.clearBuffer(); } catch (IOException localIOException) {
          } if (_jspx_page_context != null) _jspx_page_context.handlePageException(t); else
          throw new ServletException(t);
      }
    } finally {
      _jspxFactory.releasePageContext(_jspx_page_context);
    }
  }
}
View Code

二、JSP技术在开发中该怎么去用

1、不管是JSP还是Servlet,虽然都可以用于开发动态web资源。但由于这2门技术各自的特点,在长期的软件实践中,人们逐渐把servlet作为web应用中的控制器组件来使用,而把JSP技术作为数据显示模板来使用。
2、其原因为,程序的数据通常要美化后再输出:
•让jsp既用java代码产生动态数据,又做美化会导致页面难以维护。
•让servlet既产生数据,又在里面嵌套html代码美化数据,同样也会导致程序可读性差,难以维护。
•因此最好的办法就是根据这两门技术的特点,让它们各自负责各的,servlet只负责响应请求产生数据,并把数据通过转发技术带给jsp,数据的显示jsp来做。其实就是一个servlet转发给另外一个servlet

三、JSP语法

1、JSP模版元素

JSP页面中的HTML内容称之为JSP模版元素,JSP模版元素定义了网页的基本骨架,即定义了页面的结构和外观。
2、JSP脚本表达式
JSP脚本表达式(expression)用于将程序数据输出到客户端
语法:<%= 变量或表达式 %>

举例:当前时间:<%= new java.util.Date() %>
JSP引擎(把jsp翻译为servlet的程序,也就是tomcat)在翻译脚本表达式时,会将程序数据转成字符串,然后在相应位置用out.print(…) 将数据输给客户端。
JSP脚本表达式中的变量或表达式后面不能有分号(;)。
3、JSP脚本片断
1>JSP脚本片断(scriptlet)用于在JSP页面中编写多行Java代码。语法:
<%
  多行java代码
%>
注意:JSP脚本片断中只能出现java代码,不能出现其它模板元素, JSP引擎在翻译JSP页面中,会将JSP脚本片断中的Java代码将被原封不动地放到Servlet的_jspService方法中。JSP脚本片断中的Java代码必须严格遵循Java语法。
2>在一个JSP页面中可以有多个脚本片断,在两个或多个脚本片断之间可以嵌入文本、HTML标记和其他JSP元素。例:
<%
  int x = 10;
  out.println(x);
%>
<p>这是JSP页面文本</p>
<%
  int y = 20;
  out.println(y);
%>

多个脚本片断中的代码可以相互访问,犹如将所有的代码放在一对<%%>之中的情况。如:out.println(x);

3>单个脚本片断中的Java语句可以是不完整的,但是,多个脚本片断组合后的结果必须是完整的Java语句,例:

<%
    for (int i=1; i<5; i++) {
%>
<H1>www.it315.org</H1>
<%
    }
%> 

4、JSP声明,一般很少使用

JSP页面中编写的所有代码,默认会翻译到servlet的service方法中, 而Jsp声明中的java代码被翻译到_jspService方法的外面。语法:
<%!
  java代码
%>
所以,JSP声明可用于定义JSP页面转换成的Servlet程序的静态代码块、成员变量和方法 。多个静态代码块、变量和函数可以定义在一个JSP声明中,也可以分别单独定义在多个JSP声明中。JSP隐式对象的作用范围仅限于Servlet的_jspService方法,所以在JSP声明中不能使用这些隐式对象,java脚本片段中是不能加方法,静态代码块等的,因为这些代码会被放到jsp的service方法中
5、JSP注释
1>JSP注释的格式:<%-- 注释信息 --%>
2>JSP引擎在将JSP页面翻译成Servlet程序时,忽略JSP页面中被注释的内容.注意和HTML注释区别。
<%-- date --%> //jsp注释
<!-- date-->      //html注释,jsp中采用这个会增加网络流量,这个是打回浏览器后浏览器不显示。
6、JSP指令
1.JSP指令(directive)是为JSP引擎而设计的,它们并不直接产生任何可见输出,而只是告诉引擎如何处理JSP页面中的其余部分。在JSP 2.0规范中共定义了三个指令:•page指令•Include指令•taglib指令。
2.JSP指令的基本语法格式:
  <%@ 指令 属性名="" %>
  举例:<%@ page contentType="text/html;charset=gb2312"%>
如果一个指令有多个属性,这多个属性可以写在一个指令中,也可以分开写。例:
<%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="java.util.Date"%><%@ page contentType="text/html;charset=gb2312" import="java.util.Date"%>

Page指令

page指令用于定义JSP页面的各种属性,无论page指令出现在JSP页面中的什么地方,它作用的都是整个JSP页面,为了保持程序的可读性和遵循良好的编程习惯,page指令最好是放在整个JSP页面的起始位置。
*JSP 2.0规范中定义的page指令的完整语法:
<%@ page 
[ language="java" ]  //页面嵌套的语言
[ extends="package.class" ]  //jsp servlet继承的包,一般不要修改
[ import="{package.class | package.*}, ..." ]  //jsp Servlet引入的包
[ session="true | false" ]   //是否引入session,ture的话,jsp引擎会传给jsp Session 对象
[ buffer="none | 8kb | sizekb" ]  //关于缓存
[ autoFlush="true | false" ]      //关于缓存
[ isThreadSafe="true | false" ]  //ture的话JSP servlet 会继承SingleThreadModel
[ info="text" ]      
[ errorPage="relative_url" ]  //JSP出错的错误页面(必须采用相对路径),web.xml也可设置
[ isErrorPage="true | false" ]  //true的话,JSP引擎会传给jsp错误的Excepiotn 对象
[ contentType="mimeType [ ;charset=characterSet ]" | "text/html ; charset=utf-8" ]//页面类型
[ pageEncoding="characterSet | ISO-8859-1" ] //页面采用的编码,只写这句就可解决JSP乱码问题
[ isELIgnored="true | false" ]  //是否支持使用el表达式
%>

 

 

javaEE(5)_JSP

原文:http://www.cnblogs.com/wangweiNB/p/4955941.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!