第二章.JSP/Servlet及相关技术详解

JSP的4种基本语法:

  1.JSP注释:

    <%-- JSP注释部分 --%>

  2.JSP声明:

    <%! //声明一个整型变量

      public int count;

      //声明一个方法

      public String info(){

        return "hello";

      }

    %>

  3.输出JSP表达式:

    <%=count++%>

    这句话代替了Java中的out.print(count++);但是注意输出表达式后面不能有分号。

  4.JSP脚本:

 1 <%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %>
 2 <html>
 3 <head>
 4     <title>欢迎</title>
 5 </head>
 6 <body>
 7 <table bgcolor="#9999dd" border="1" width="300px">
 8 <%
 9 for(int i = 0; i < 10; i++){
10 %>
11 <tr>
12     <td>循环值:</td>
13     <td><%=i%></td>
14     </tr>
15 <%
16 }
17 %>
18 </body>
19 </html>
View Code

JSP的3个编译指令:(这里只讲两个)

  1.page指令:位于JSP页面的顶端,一个JSP页面可以是用多条page指令。

  page语法格式:<%@page  contentType="text/html; charset=GBK" language="java" ... %>

contentType属性参考网页:http://developer.51cto.com/art/201106/270666.htm

  2.include指令:可以将一个外部文件嵌入到当前JSP文件中,同时解析这个页面中的JSP语句。

    include既可以包含静态的文本,也可以包含动态的JSP页面。静态的include编译指令会将被包含的页面加入本页面,融合成一个页面,因此被包含页面不需要是一个完整

     页面。

    静态include格式:<%@include file="relativeURLSpec"%>

JSP的7个动作指令:

  1.forward指令:用于将页面响应转发到另外的页面。既可以转发到静态的HTML页面,也可以转发到动态的JSP页面,或者转发到容器中的Servlet.

  2.include动态指令:用于包含某页面,被包含的页面不会导入包含页面,仅仅将被包含页面的body内容插入本页面。

  3.useBean指令:用于在JSP页面初始化一个Java实例

  4.setProperty指令:用于为JavaBean实例的属性设置值

  5.getProperty指令:用于输出JavaBean实例的属性

  若多个JSP页面需要重复使用某段代码,则可以把这段代码定义成Java类的方法,然后让多个JSP页面调用该方法,这样可以代码复用。

  6.plugin指令:主要用于下载服务器端的JavaBean或Applet到客户端执行。由于程序在客户端执行,所以客户端必须安装虚拟机

  7.param指令:用于设置参数值,该指令不能单独使用,可以与jsp:include、jsp:forward、jsp:plugin三个指令结合使用。

JSP脚本中的9个内置对象:

  这9个内置对象都是Servlet API接口的实例,只是JSP规范对它们进行了默认初始化(有JSP页面对应Servlet的_jspService()方法来创建这些实例)。即它们已经是对象,可直接

   使用。

  1.application:javax.servlet.ServletContext的实例,这个实例代表JSP所属的Web应用本身,可用于JSP页面,或者Servlet之间交换信息。

  2.config:javax.servlet.ServletConfig的实例,该实例代表该JSP的配置信息。

  3.exception:java.lang.Throwable的实例,用来代表其他页面中的异常和错误。只有当页面是错误处理页面,即编译指令page的isErrorPage属性为true时,该对象才可以使用

  4.out:javax.servlet.jsp.JspWriter的实例,该实例代表JSP页面的输出流,用于输出内容,形成HTML页面。

  5.page:代表该页面本身,也就是Servlet中的this,其类型就是生成的Servlet类,能用page的地方就可用this。

  6.pageContext:javax.servlet.jsp.PageContext的实例,该对象代表JSP页面上下文使用该对象可以访问页面中的共享数据。

  7.request:javax.servlet.http.HttpServletRequest的实例,该对象封装了一次请求,客户端的请求参数都被封装在该对象里,获取客户端请求参数必须使用该对象。

  8.response:javax.servlet.http.HttpSerletResponse的实例,代表服务器对客户端的响应。通常很少使用该对象直接响应,而是使用out对象,除非需要生成非字符响应。

    response对象常用于重定向。

  9.session:javax.servlet.http.HttpSession的实例,该对象代表一次会话。当客户端浏览器和站点建立连接时,会话开始;当客户端关闭浏览器时,会话结束。

Servlet介绍:

  JSP的本质就是Servlet,开发者把编写好的JSP页面部署在Web容器中之后,Web容器会将JSP编译成对应的Servlet。

  直接使用Servlet坏处:Servlet的开发效率非常低,特别是当使用Servlet生成表现层页面时,页面中的所有HTML标签,都采用Servlet的输出流来输出,极其繁琐。

  自MVC规范出现后,Servlet的责任开始明确下来,仅作为控制器使用,不在需要生成页面标签,也不再作为视图层角色使用。

Servlet的开发:

  Servlet被称为服务器端小程序,是运行在服务器端的程序,用于处理及响应客户端的请求。

  Servlet是个特殊的java类,继承自HTTPServlet。

  Servlet提供不同的方法用于响应客户端请求:

    1.doGet:响应客户端的GET请求

    2.doPost:响应客户端POST请求

    3.doPut:响应客户端PUT请求

    4.doDelete:响应客户端DELETE请求

  客户端的请求通常只有GET和POST两种,Servlet为了响应这两种请求,必须重写doGet()和doPost()两个方法。

  大部分时候Servlet对于所有请求的响应都是完全一样的。此时可以采用重写service(HttpServletRequest request, HttpServletResponse response)方法来代替上面的几个方法,

   即可响应客户端的所有请求。

  不用为Servlet类编写构造器,若要对Servlet执行初始化操作,应将初始化操作放在Servlet的init()方法中定义。若重写init(ServletConfig config)方法,则应该在重写该方法的

   第一行调用super.init(config)。这样该方法将调用HTTPServlet的init方法。

 1 package lee;
 2 
 3 import javax.servlet.*;
 4 import javax.servlet.http.*;
 5 import javax.servlet.annotation.*;
 6 
 7 import java.io.*;
 8 
 9 // Servlet必须继承HttpServlet类
10 @WebServlet(name="firstServlet"
11     , urlPatterns={"/firstServlet"})
12 public class FirstServlet extends HttpServlet
13 {
14     // 客户端的响应方法,使用该方法可以响应客户端所有类型的请求
15     public void service(HttpServletRequest request,
16         HttpServletResponse response)
17         throws ServletException,java.io.IOException
18     {
19         // 设置解码方式
20         request.setCharacterEncoding("GBK");
21         response.setContentType("text/html;charSet=GBK");
22         // 获取name的请求参数值
23         String name = request.getParameter("name");
24         // 获取gender的请求参数值
25         String gender = request.getParameter("gender");
26         // 获取color的请求参数值
27         String[] color = request.getParameterValues("color");
28         // 获取country的请求参数值
29         String national = request.getParameter("country");
30         // 获取页面输出流
31         PrintStream out = new PrintStream(response.getOutputStream());
32         //输出HTML页面标签
33         out.println("<html>");
34         out.println("<head>");
35         out.println("<title>Servlet测试</title>");
36         out.println("</head>");
37         out.println("<body>");
38         // 输出请求参数的值:name
39         out.println("您的名字:" + name + "<hr/>");
40         // 输出请求参数的值:gender
41         out.println("您的性别:" + gender + "<hr/>");
42         // 输出请求参数的值:color
43         out.println("您喜欢的颜色:");
44         for(String c : color)
45         {
46             out.println(c + " ");
47         }
48         out.println("<hr/>");
49         out.println("您喜欢的颜色:");
50         // 输出请求参数的值:national
51         out.println("您来自的国家:" + national + "<hr/>");
52         out.println("</body>");
53         out.println("</html>");
54     }
55 }
View Code

  Servlet和JSP的区别是:

    1.Servlet中没有内置对象,原来JSP中的内置对象都必须由程序显示创建

    2.对于静态的HTML标签,Servlet都必须使用页面输出流逐行输出

  JSP是Servlet的一种简化,使用JSP只需要完成程序员要输出到客户端的内容,JSP脚本嵌入一个类中由JSP容器完成。

  Servlet是一个完整的Java类,这个类的service()方法用于声称对客户端的响应。

Servlet的配置:

  编辑好的Servlet源文件并不能响应用户请求,还需将其编译成class文件。将编译后的class文件放在WEB-INF/classes路径下,若Servlet有包,则在WEB-INF/classes路径下创建

   对应的文件夹。

  从Servlet3.0开始,配置Servlet有两种方式:

    1.在Servlet类中使用@WebServlet注解进行配置:参考网址:http://blog.csdn.net/kpchen_0508/article/details/41312735

    2.在web.xml文件中进行配置:参考网址:http://01121264-163-com.iteye.com/blog/1530063

JSP/Servlet的生命周期:

  JSP本质是Servlet,开发者编写的JSP页面将由Web容器编译成对应的Servlet,当Servlet在Web容器中运行时,其实例的创建及销毁都不是由程序员决定的,而是由Web容器进

   行控制。

  创建Servlet实例有两个时机:

    1.客户端第一次请求某个Servlet时,系统创建Servlet的实例:大部分的Servlet都是这种。

    2.Web应用启动时立即创建Servlet实例,即load-on-startup Servlet。

  每个Servlet的运行都遵循如下生命周期:

    1.创建Servlet实例

    2.Web容器调用Servlet的init方法,对Servlet进行初始化

    3.Servlet初始化后,将一直存在于容器中,用于响应客户端请求。若客户端发送GET请求,Web容器调用Servlet的doGet方法处理并响应请求;若客户端发送POST请求,

     荣器调用Servlet的doPost方法处理并响应请求。或统一使用service()方法来响应用户请求。

    4.Web容器决定销毁Servlet时,先调用Servlet的destroy方法,通常在关闭Web应用之时销毁Servlet。

深入理解Java对象的创建过程:类的初始化与实例化:http://blog.csdn.net/justloveyou_/article/details/72466416

Servlet生命周期与工作原理http://www.cnblogs.com/cuiliang/archive/2011/10/21/2220671.html

Request的getParameter和getAttribute方法的区别: http://blog.csdn.net/huoyunshen88/article/details/8603306

使用Servlet作为控制器:

  M:Model,模型,对应JavaBean,对数据进行操作

  V:View,视图,对应JSP页面,展示给用户的页面

  C:Controller,控制器,对应Servlet,做出M和V之间的逻辑

URI和URL的区别:http://www.cnblogs.com/gaojing/archive/2012/02/04/2413626.html

 Filter介绍:

  使用Filter完整的流程是:Filter对用户请求进行预处理,接着将请求交给Servlet进行处理并生成响应,最后Filter在对服务器响应进行后处理。

  Filter有如下几个用处:

    1.在HttpServletRequest到达Servlet之前,拦截客户的HttpServletRequest

    2.根据需要检查HttpServletRequest,也可以修改HttpServletRequest头和数据

    3.在HttpServletResponse到达客户端之前,拦截HttpServletResponse

    4.根据需要检查HttpServletResponse,也可以修改HttpServletResponse头和数据

  Filter有如下几个种类:

    1.用户授权的Filter:Filter负责检查用户请求,根据请求过滤用户非法请求

    2.日志Filter:详细记录某些特殊的用户请求

    3.负责解码的Filter:包括对非标准编码的请求解码

    4.能改变XML内容的XSLT Filter等

    5.Filter可负责拦截多个请求或响应;一个请求或响应也可被多个Filter拦截

  创建一个Filter只需两个步骤

    1.创建Filter处理类

    2.web.xml文件中配置Filter

静态和伪静态网站的区别:http://www.divcss5.com/html/h63.shtml

使用URL Rewrite实现网站伪静态:http://www.cnblogs.com/ljxxz/p/3560791.html

<url-pattern>/*</url-pattern>的解释:http://blog.csdn.net/qq_36870779/article/details/62883466

application,request,session三个对象,谁可以获取谁?http://www.cnblogs.com/z0228-0322x/p/6170588.html

原文地址:https://www.cnblogs.com/lanshanxiao/p/7461255.html