大二第一学期的时候有学JSP的课,但是因为在开学之前做过JSP的小项目,所以一个学期的课也没听,直到期末考试成绩出来了,才回想JSP的内容还有多少记得,没想到模模糊糊也记不起多少,赶紧回头学回来。接下来是关于Servlet和JSP的梳理。
-------------------------------------------------------------------------------------------------------------------------------------------------
Servlet是一个Java程序,一个Servlet应用有一个或多个Servlet程序,而且JSP页面也会被转换和编译成Servlet程序。
Servlet应用无法独立运行,必须运行在Servlet容器中。Servlet容器将用户的请求传递给Servlet应用,并将结果返回给用户。由于大部分Servlet应用都包含多个JSP页面,因此更准确地说是“Servlet/JSP应用”。
其中,Servlet API是开发Servlet的主要技术。而Servlet API有以下4个Java包:
Java包 |
包含的内容 |
javax.servlet |
定义Servlet和Servlet容器之间契约的类和接口 |
javax.servlet.http |
定义HTTP Servlet和Servlet容器之间契约的类和接口 |
javax.servlet.annotation |
标注Servlet、Filter、Listener的标注。它还被标注原件定义元数据 |
javax.servlet.descriptor |
包含提供程序化登陆web应用程序的配置信息的类型。 |
Servlet技术的核心是Servlet,它是所有Servlet类必须直接或间接实现的一个接口,而Servlet接口定义了Servlet与Servlet容器之间的契约。这个契约归结起来就是,Servlet容器将Servlet类载入内存,并在Servlet实例上调用具体的方法。当用户的请求使得Servlet容器调用Servlet的Service方法,会传入一个ServletRequest实例和一个ServletResponse实例,其中,ServletRequest中封装了当前的HTTP请求,而ServletResponse表示当前用户的HTTP响应。对于每一个应用程序,Servlet容器还会创建一个ServletContext实例,这个对象中封装了上下文(应用程序)的环境详情。每个上下文只有一个ServletContext,而且每个Servlet实例都有一个配置的ServletConfig。
Servlet的生命周期方法:
Servlet容器的生命周期方法 |
作用 |
init |
该方法在Servlet第一次被请求的时候,Servlet就会调用这个方法,而后不再被调用,所以可以用这个方法进行初始化工作。调用这个方法时,Servlet容器会传入一个ServletConfig。 |
Service |
每当请求Servlet时,Servlet容器就会调用这个方法。第一次请求Servlet时,Servlet容器调用init方法和Service方法。后续的请求将只调用Service方法。 |
destroy |
当要销毁Servlet时,Servlet容器就会调用这个方法。一般会在这个方法中编写清除代码。 |
在介绍一个Servlet中另外两个非生命周期的方法:
Servlet容器的非生命周期方法 |
作用 |
getServletInfo |
这个方法会返回Servlet的描述 |
getServletConfig |
这个方法会返回由Servlet容器传给init方法的ServletConfig。 但是为了让getServletConfig返回一个非null值,必须将传给init方法的ServletConfig赋给一个类级变量。 |
-------------------------------------------------------------------------------------------------------------------------------------------------
接下来是Servlet的各类接口:
ServletRequest
接口 |
说明 |
ServletRequest |
对于每一个HTTP请求,Servlet容器都会创建一个ServletRequest实例,并将它传给Servlet的Service方法。ServletRequest封装了关于这个请求的信息。 |
常用的方法有:
方法 |
说明 |
public int getContentLength() |
返回请求主体的字节数。 |
public java.lang.String getContentType() |
返回请求主体的MIME类型。 |
public java.lang.String getParameter(java.lang.String name) |
返回指定请求参数的值 |
public java.lang.String getProtocol() |
返回这个HTTP请求的协议名称和版本 |
ServletResponse
接口 |
说明 |
ServletResponse |
该接口表示一个Servlet响应。在调用Servlet的Service方法前,Servlet容器首先创建一个ServletResponse,并将它作为第二个参数传给Service方法。ServletResponse隐藏了向浏览器发送响应的复杂过程。 |
常用的方法:
方法 |
说明 |
getWriter() |
返回了一个可以向客户端发送文本的java.io.PrintWriter。默认情况下,PrintWriter对象使用ISO-8859-1编码。 |
setContentType(“type”) |
设置响应的内容类型,并将”text/html”作为一个参数传入。如果没有设置相应内容类型,有些浏览器就会将HTML标签显示为普通文本。 |
ServletConfig
接口 |
说明 |
ServletConfig |
用于存储关于Servlet的配置信息。 当Servlet容器初始化Servlet时,Servlet容器会给Servlet的init()方法传入一个ServletConfig。ServletConfig封装可以通过@WebServlet或描述符传给Servlet的配置信息。 |
常用的方法:
方法 |
说明 |
java.lang.String getInitParameter(java,lang.String name) |
为了从Servlet内部获取到初始参数的值,要在Servlet容器传给Servlet的init方法的ServletConfig中调用getInitParameter方法。 |
java.util.Enumration<java.lang.String> getInitParameterNames() |
返回所有初始参数名称的一个Enumeration。 |
String contactName = servletConfig.getInitParameter(“contactName”) |
获取contactName参数值 |
ServletContext
接口 |
说明 |
ServletContext |
每个Web应用程序只有一个上下文,所以ServletContext可以存储这个上下文,并且ServletContext还可以共享从应用程序中的所有资料处访问到的信息,并且可以动态注册Web对象,而且是用ServletContext内部的Map保存。 |
常用的方法:
方法 |
说明 |
getServletContext().getInitParameter(String name) |
获取在项目下的web.xml中设置context的初始化参数 |
this.getServletContext().log(“测试”) |
在web.xml文件中,使用logger元素来设置日志文件 |
getAttribute(String name)/get AttributeNames() |
获取ServletContext中的属性 |
setAttribute(String name, Object object) |
设置ServletContext中的属性 |
removeAttribute(String name) |
移除ServletContext中的属性 |
GenericServlet
接口 |
说明 |
GenericServlet |
GenericServlet实现了Servlet和ServletConfig接口。将init方法中的ServletConfig赋给一个类级变量,以便可以通过getServletConfig获取,为Servlet接口中的所有方法提供默认的实现,而且提供包括ServletConfig中的方法。 |
Http Servlets
接口 |
说明 |
HttpServlet |
HttpServlet类覆盖了javax.servlet.GenericServlet类。使用HttpServlet时,还要借助分别代表Servlet请求和Servlet响应的HttpServletRequest和HttpServletResponse对象。而HttpServlet与GenericServlet的差别在于,HttpServlet覆盖的是doGet或者doPost方法,而不是Service方法,而且使用的是HttpServletRequest和HttpServletResponse,而不是ServletRequest和ServletResponse。 |
HttpServletRequest |
表示HTTP环境中的Servlet请求 |
HttpServletResponse |
表示HTTP环境中的Servlet响应 |
各个接口常用的方法如下:
接口 |
方法 |
说明 |
HttpServletRequest |
java.lang.String getContextPath() |
返回表示请求上下文的请求URI部分。 |
HttpServletRequest |
Cookie[] getCookies() |
返回一个Cookie对象的数组。 |
HttpServletRequest |
java.lang.String getHeader(java.lang.String name) |
返回指定HTTP标题的值。 |
HttpServletRequest |
java.lang.String getMethod() |
返回生成这个请求的HTTP方法名称 |
HttpServletRequest |
java.lang.String getQueryString() |
返回请求URL中的查询字符串。 |
HttpServletRequest |
HttpSession getSession() |
返回与这个请求相关的会话对象。如果没有,将创建一个新的会话对象。 |
HttpServletRequest |
HttpSession getSession(Boolean create) |
返回与这个请求相关的绘画对象,如果有,并且create参数为True,将创建一个新的会话对象。 |
HttpServletResponse |
void addCookie(Cookie cookie) |
给这个响应对象添加一个cookie。 |
HttpServletResponse |
void addHeader(java.lang.String name, java.lang.String value) |
给这个响应对象添加一个header。 |
HttpServletResponse |
void sendRedirect(java.lang.String location) |
发送一条响应码,将浏览器跳转到指定的位置。 |
-------------------------------------------------------------------------------------------------------------------------------------------------
当用户提交HTML表单时,在表单元素中输入的值就会被当作请求参数发送到服务器。HTML输入域(文本域、隐藏域或者密码域)或者文本区的值,会被当作字符串发送到服务器。空的输入域或者文本区会发送空的字符串。
包含多个值的select元素发出一个字符串数组,可以通过ServletRequest.getParameterValues进行处理。
核查过的复选框会发送字符串"on"到服务器,未经核查的复选框则不向服务器发送任何内容,ServletRequest.getParameter(fieldName)返回null。
单选框将被选中按钮的值发送到服务器。如果没有选择任何按钮,将没有任何内容被发送到服务器,并且ServletRequest.getParameter(fieldName)返会null。
如果一个表单中包含多个输入同名的元素,那么所有值都会被提交,并且必须利用ServletRequest.getParameterValues来获取它们。ServletRequest.getParameter将只返回最后一个值。