为什么要使用JSP

  既然我们有Servlet,可以对客户端做出响应,为什么还要使用JSP,我们首先来分析HTML、Servlet和JSP的特点:

  HTML:HTML是静态页面,是“死”的,不能够编程,页面上不能存在变量,但是请求十分方便

  Servlet:灵活,可以编程来控制程序的执行,但是如果需要向客户端响应大量的HTML页面,那会十分麻烦,

  JSP:可以在JSP页面直接使用HTML,jsp编译器会自动将HTML的文本转换为out.write()方法中的内容发送给客户端,同时JSP页面也可以存在Java脚本,

  我们可以看出,JSP的优点,即可以存在HTML文本,有可以存在Java脚本,这是其他两种方式所不能替代的。

  JSP的文格式更加简单,同时JSP易于生成在Web浏览器中显示的内容。JSP可以 改善编程速度、效率和开发过程的准确性。

JSP和Servlet的分工

  JSP一般作为请求的发起页面和请求的结束页面来显示数据,中间的请求处理过程就交给Servlet了,Servlet将请求处理的结果转发到JSP,然后通过JSP来显示处理结果,JSP不直接处理请求,一般在页面上点击超链接,提交表单都是在请求Servlet,这样就形成了两个层次,JSP负责用户视图,Servlet负责服务的提供。

   

JSP的组成

  JSP页面中可以存在HTML、Java脚本、JSP标签和指令

  在_jspService方法中,可以使用的对象有:

  • HttpServletRequest request:_jspService方法的参数
  • HttpServletResponse response:同上     
  • PageContext pageContext;// 当前页面的域对象 
  • HttpSession session:表示当前会话,所以客户端直接访问JSP时,客户端就会直接创建session,设置Cookie,将JSESSIONID发送给客户端
  • ServletContext application:最大的域对象
  • ServletConfig config:获取servlet(JSP)配置信息
  • JspWriter out:用来向客户端响应内容
  • page = this:当前对象
  • Throwable exception:当Page中,存在isErrorPage属性时,就有这个对象

  JSP中的三种Java脚本:

  • <%...%>  
  • <%=...%>
  • <%!...%>

  我们分别来实验,这三种脚本的使用方式:

  首先在index.jsp 中添加如下代码
  

<%
  int a = 10;
  class A {
      int b = 1;
  }
  System.out.println("111");
%>

  然后我们再去查看经过编译后的Servlet的代码,发现上面的代码部分出现在了_jspService 方法的try块中,那么可以推测,<%..%> 这个脚本实际上就是在_jspService方法中写一些Java代码,

  我们再添加如下代码

  <%= 111%>
  发现111被使用out,输出到了客户端,可以推测,<%=%>这个脚本中的内容其实都会出现在out.print方法中,

  再添加如下代码:

  <%!  int a = 10;%>

  我们该代码出现在index_jsp.java 类中,即声明了一个变量a

  总结:

  <%...%>脚本的内容会被输出到_jspService方法中

  <%=..%>脚本的内容会被输出到out.print方法中

  <%! ...%> 脚本的内容会被输出到类体中,即

class A {

  成员

  方法

  构造方法

  构造块(初始化块)

  静态块

  内部类

}

  需要注意的是:JSP在第一次被请求时,被即时转换并编译,对于之后的请求,直接使用编译好的JSP,所以第一次请求的响应往往都稍慢一些,当然也有的Web容器提供了预编译JSP的功能,但是项目部署的速度也就会降低。

 

  我们再来分析请求JSP时,服务器做的事,我们之前说过,所有的JSP请求,实际上都会被一个tomcat的默认Servlet处理:

    <servlet>
        <servlet-name>jsp</servlet-name>
        <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
        <load-on-startup>3</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

    <!-- The mappings for the JSP servlet -->
    <servlet-mapping>
        <servlet-name>jsp</servlet-name>
        <url-pattern>*.jsp</url-pattern>
        <url-pattern>*.jspx</url-pattern>
    </servlet-mapping>

  可以猜测到tomcat配置的默认的Servlet将会解析请求的URL,然后转发给对应的由JSP转换过来的Servlet处理。

  客户端第一次请求JSP时:

  1. JSP文件将会被编译成.java文件
  2. 然后再继续编译成.class文件
  3. 然后创建该对象
  4. 调用service方法,完成响应

  第二次请求JSP时,直接调用service方法

 

JSP中注释的使用

<!--这是一个注释--> --->这种注释会被发送到客户端,只不过浏览器会忽略这个注释,但是查看源代码,可以看到
<%--这也是一条注释--%> ---> 这种注释不会被发送到客户端,当服务器把JSP编译成Java文件时,就已经忽略了注释了,

 

posted on 2018-10-09 21:32  yusiming  阅读(148)  评论(0)    收藏  举报