文章目录
Tomcat
Servlet是Web应用与web服务器进行协作的标准接口,Tomcat(Servlet容器)负责把请求传给相应的Servlet
Servlet从ServletRequest中获取客户的请求信息,利用ServletResponse对象来生成响应结果
一、Servlet接口
Servlet是一个接口定义了5个方法,init、service、destroy和getServletConfig、getServletInfo
GenericServlet抽象类
GenericServlet抽象类为Servlet提供通用实现,只有service方法没有实现,init和destory都是空实现。除了实现Servlet外,还实现了ServletConfig和Serializable接口
两个init方法,一个是init()还有一个是init(ServletConfig config),它会赋值给私有变量ServletConfig和调用init()方法,Servlet还有一个getServletConfig方法,从而就可以调用ServletConfig接口的函数
HttpServlet类
HttpServlet类是GenericServlet的子类,在开发JavaWeb应用的时,自定义的Servlet类一般都扩展HttpServlet类,一般HttpServlet的子类,一般会针对客户端的请求方式,来覆盖HttpServlet父类中的响应doXXX()方法,为了使doXXX()方法能被Servlet容器访问,应该把访问权限设为public。
注意:
一般Servlet容器会调用service(ServletRequest req,ServletResponse res),在这个类中service(ServletRequest req,ServletResponse res)会调用service(HttpServletRequest req,HttpServletResponse resp),在这个函数中会调用doGet(HttpServletRequest req,HttpServletResponse resp)和doPost(HttpServletRequest req,HttpServletResponse resp)方法
ServletRequest接口
ServletRequest类表示来自客户端的请求,当Servlet容器接收到客户端要求访问的特定Servlet的请求时,容器先解析客户端的原始请求数据,把它包装成一个ServletRequest对象,当容器调用Servlet对象的service()方法时,就可以把ServletRequest对象作为参数传给service()方法。ServletRequest接口提供了一系列用于读取客户端请求数据的方法:比如getParameter(String name )
HttpServletRequest接口
它提供了用于读取HTTP请求中的相关信息的方法
它是ServletRequest接口的子接口,HttpServlet类的重载service方法以及doGet和doPost等方法都有一个HttpServletRequest类型的参数,它提供了用于读取HTTP请求中的相关信息的方法,比如getContextPath()、getCookies()、getHeader(String name)、getHeaderNames()、getMethod()、getRequestURI()、getQueryString()
ServletResponse接口
在ServletResponse接口中定义了一系列与生成响应结果有关的方法
Servlet通过ServletResponse对象来生成响应结果,当Servlet容器接收到到客户端要求访问特定的Servlet的请求时,容器会创建一个ServletResponse对象,并把它作为参数传给Servlet的Service()方法。 在ServletResponse接口中定义了一系列与生成响应结果有关的方法:
HttpServletResponse接口
HttpServletResponse接口是ServletResponse的子接口,HttpServlet类的重载service()方法以及doGet和doPost等方法都有一个HttpServletResponse类型的参数,有一些函数比如addCookie(Cookie cookie) setStatus(int sc)等
二、ServletConfig接口
当Servlet容器初始化一个Servlet对象时,会为这个Servlet对象创建一个ServletConfig对象。在ServletConfig对象中包含了Servlet的初始化参数信息,Servlet容器在调用Servlet对象的init(ServletConfig config)方法时,会把ServletConfiug对象作为参数传递给Servlet对象。
三、ServletContext接口
ServletContext是Servlet与Servlet容器之间直接通信的接口,Servlet在启动一个web应用时,会为它创建一个ServletContext对象。每个web应用都有唯一的ServletContext对象,可以把ServletContext对象形象的理解为web应用的总管家,同一个web应用中的所有Servlet对象都共享一个总管家,Servlet对象们可通过这个总管家来访问容器中的各种资源
四、总结:
GenericServlet实现Servlet接口和ServletConfig、Serializable接口,HttpServlet会继承GenericServlet接口
HttpServletRequest继承ServletRequest,它提供了用于读取HTTP请求中的相关信息的方法。HttpServletResponse继承ServletResponse接口, 在ServletResponse接口中定义了一系列与生成响应结果有关的方法。
五、Servlet容器响应客户请求访问特定Servlet的流程:
六、web.xml
七、JavaWeb应用必须采用固定的目录结构
为了让Servlet容器能找到JavaWeb应用中的各个组件,Servlet规范规定,JavaWeb应用必须采用固定的目录结构,即每种类型的组件在Web应用中有固定的存放目录。Servlet规范还规定,JavaWeb应用的配置信息存放在WEB-INF/web.xml文件中,Servlet容器从该文件中读取配置信息,在发布某些web组件(如Servlet)时,需要在web.xml文件中添加相应的关于这些web组件的配置信息。
八、转发和重定向
1、转发
由服务器端进行的页面跳转
转发的方法
转发的特点
- 地址栏不发生变化,显示的是上一个页面的地址
- 请求次数:只有1次请求
- 请求域中数据不会丢失
重定向
由浏览器端进行的页面跳转
重定向方法
重定向特点
- 地址栏:显示新的地址
- 请求次数:2次
- 请求域中的数据会丢失,因为是2次请求
转发和重定向的问题
-
问:什么时候使用转发,什么时候使用重定向?
如果要保留请求域中的数据,使用转发,否则使用重定向。
以后访问数据库,增删改使用重定向,查询使用转发。 -
问:转发或重定向后续的代码是否还会运行?
无论转发或重定向后续的代码都会执行
九、读写Cookie(点心)
可以把Cookie和Session理解成客户端与服务端之间共享数据
Cookie指的是客户端访问Web服务器时,服务器在客户端硬盘上存放的信息,好像是服务器送给客户的点心,服务器可以根据Cookie来跟踪客户状态。
Cookie的直观理解
去健身房健身,健身馆首先向来报名的客户发送一张会员卡,会员卡上存储了客户的编号、姓名和照片等信息,以后每次客户到健身馆来健身,先要出示会员卡,健身馆根据会员卡的信息来判断是否允许客户健身。
也就是说,当客户端首次访问服务器时,服务器在客户端存放包含客户的相关信息的Cookie,以后每次客户端访问服务器时,都会在HTTP请求数据中包含Cookie,服务器解析HTZTP请求中的Cookie,就能获取关于客户的信息。
Tomcat中的Cookie
存Cookie
Cookie用javax.servlet.http.Cookie来表示,玫瑰花Cookie对象包含一个Cookie名字和Cookie值。
通过HttpServletResponse的addCookie()方法,把Cookie添加到HTTP响应结果中。
Cookie cookie = new Cookie(“username”,“Tom”);
response.addCookie(cookie);
读取Cookie
如果Servlet想读取来自客户端的Cookie,可以通过Cookie cookies[] = request.getCookies()来获取HTTP请求中的所有的Cookie。
设置 的有效期
setMaxAge(int expiry):设置Cookie有效期
-
expiry>0表示浏览器在客户端硬盘上保存Cookie的时间为expiry秒
-
expiry=0,就指示浏览器删除当前Cookie
-
expiry<0,就指示浏览器不要把Cookie保存到客户端硬盘,Cookie仅存在于浏览器进程中,当浏览器关闭,Cookie也就消失。
cookie.getMaxAge()获取Cookie的有效期
安全隐患
服务器对客户端进行读写Cookie操作,会给客户端带来安全隐患,服务器可能会向客户端发送包含恶意代码的Cookie数据,此外,服务器可能会根据客户端的Cookie来窃取用户的保密信息,因此出于安全起见,多数浏览器可以设置是否启用Cookie。
Cookie的读取
可以设置Cookie的读取范围,服务端发给客户端的Cookie,默认只能这个服务端读取,其他服务端不可以读取,但是是可以设置让其他服务端读取的。
十、Session
HTTP会话的使用与管理
当客户访问Web应用时,在许多情况下,Web服务器必须能够跟踪客户的状态,比如有若干客户,以合法的账户登陆到电子邮件系统,然后分别进行收信、写信和发信等一系列操作,在这个过程中,假如某个客户请求查看收件箱,Web服务器必须能够判断发出请求的客户的身份,这样才能返回与这个客户相对应的数据。
Web服务器跟踪客户状态通常有四种方法:
1、在HTML表单中加入隐藏字段,它包含用于跟踪客户状态的数据
2、重写URL,使它包含用于跟踪客户状态的数据
3、用Cookie来传送用于跟踪客户状态的数据
4、使用会话机制
会话简介
在web开发领域,会话机制是用于跟踪客户状态的普遍解决方案,会话指的是在一段时间内,单个客户与Web应用的一连串的交互过程,在一个会话中,客户可能会多次访问Web应用的同一个网页,也有可能访问同一个web应用中的多个网页。
例如在电子邮件应用中,从一个客户登录到电子邮件系统,经过收信、写信和发信等一系列操作,直到最后退出邮件系统,整个过程为一个会话
Session标识的传递过程
当程序需要为某个客户端的请求创建一个session时,服务器首先检查这个客户端的请求里是否包含了一个session标识(即sessionI如果已经包含一个sessionId则说明以前已经为此客户创建过session,服务器就按照session id把这个session检索出来使用(如果检索不到,可能会新建一个,这种情况可能出现在服务端已经删除了该用户对应的session对象,但用户人为地在请求的URL后面附加上一个JSESSION的参数)。
如果客户请求不包含sessionId,则为此客户创建一个session并且生成一个与此session相关联的sessionId,这个sessionId将在本次响应中返回给客户端保存。
如果一个Web组件支持会话,那就意味着:
当客户请求访问该Web组件时,Servlet容器会自动查找HTTP请求中表示Session ID的Cookie,以及向HTTP响应结果中添加表示Session Id的Cookie。Servlet容器还会创建新的HttpSession对象或者寻找已经存在的与Session ID对应的HttpSession对象
Session的创建(客户端第一次请求获得Session的时候创建)和删除
Session创建
(1). 对于Jsp: 若当前页面为浏览器(客户端)访问web应用的第一个资源页面且Jsp的Page指定的Session属性的值为true。
(2). 对于Servlet: 若当前Servlet为浏览器(客户端)访问web应用的第一个资源时,使用request.getSession()或者request.getSession(true)创建, 有些人不理解,为什么是通过request来获取session,可以这样理解,在获取session时,需要检测请求中是否有session标识,所以需要用request来获取
Session删除
(1). 调用session.invalidate()方法
(2). 卸载web应用程序
(3). 超过了HttpSession的过期时间
Session例子
import javax.servlet.http.HttpSession;
import java.io.IOException;
public class ServletDemo extends javax.servlet.http.HttpServlet {
HttpSession session;
protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
session = request.getSession();
String renjie = (String) session.getAttribute("renjie");
if(renjie==null)
{
System.out.println("第一次没得到Session");
session.setAttribute("renjie","123");
}
else
{
System.out.println("得到session啦");
System.out.println(session.getAttribute("renjie"));
}
}
protected void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
doPost(request,response);
}
HttpSession接口
十、JSP
当客户端请求访问jsp文件时,Servlet容器先把它编译成Servlet类,然后调用它的程序代码。
在传统的HTML文件中加入Java程序片段和JSP标记,就构成了JSP文件。
例子:hello.jsp
hello.jsp中的<%= request.getParameter(“username”)%>采用了JSP的语法,其作用是向网页上输出requst.getParameter(“username”)的返回值。
当Servlet容器接收到客户端的要求访问特定JSP文件的请求时,容器按照以下流出来处理客户请求:
1、查找与JSP文件对应的Servlet,如果已经存在,就调用它的服务方法。
2、如果JSP文件对应的Servlet还不存在,就解析系统中的JSP文件,把它翻译成Servlet源文件,接着把Servlet源文件编译成Servlet类,然后在初始化并运行Servlet。
Tomcat把由JSP生成的Servlet源文件和类文件放在<CATALINA_HOME>/work下。
JSP虽然看上去像HTML文件,但是本质上是Servlet。
JSP语法
在Servlet类中可以通过import导入Java包,而在JSP中,可以通过以下page指令来引入Java包:
<%@ page import=“java.util.Hashtable”%>
在Servlet类中可以通过以下方式设置响应正文的类型
response.setContextType(“text/html;charset=GB2312”);
在JSP中,可以通过以下page指令设置响应正文的类型
<%@ page contextType=“text/html;charset=GB2312”%>
在JSP文件(扩展名为.jsp)中除了可以直接包含HTML文本,还可以包含以下内容:
1、JSP指令
2、JSP声明
3、Java程序片段
4、Java表达式
5、JSP隐含对象
JSP指令
JSP指令(在“<%@”和“%>”内)用来设置和整个JSP网页相关的属性,如网上的编码方式和脚本语言等,JSP指令的一般语法形式为
<%@ 指令名 属性=“值” %>
1、page指令
2、include指令
JSP可以通过include指令来包含其他文件的内容,被包含的文件可以是JSP文件或HTML文件,include指令的语法为:
<%@ include file=“目标组件的绝对URL或相对URL”%>
在开发网站时候,如果多数网页包含相同的内容,则可以把这部分相同的内容单独放在一个文件中,其他的JSP文件可以通过include指令即可将这个文件包含进来,这样做可以提高代码的重用性,避免重复编码,从而提高开发网站的效率,而且便于维护。
JSP声明
JSP声明(在“<%!”和“%>”内)用于声明与JSP对应的Servlet类的成员变量和方法,语法如下:
<%! declaration;(declaration)] …>
例如:
Java程序片段
JSP文件中,可以在"<%“和”%>"标记间直接嵌入任何有效的Java程序代码。如果在page指令中没有指定method属性,那么这些程序片段默认为与JSP对应的Servlet类的service方法中的代码块。
Java表达式
Java表达式的标记为"<%="和“%>”,如果在JSP文件的模版文本中使用该标记,那么它能把表达式的值输出到网页上,表达式中的int或者float类型的值都自动专程字符串再进行输出。
注意
如果hitcount在JSP声明中定义,那么为实例对象,count变量在程序片段中定义,则为局部变量。
隐含对象
Servlet可以自由访问Servlet容器提供的ServletContext、ServletRequest和ServletResponse等对象,在JSP的程序片段中,如何访问这些对象呢,对于JSP程序片段,这些对象称为隐含对象,每个对象都被固定的引用变量引用,JSP不需要做任何变量声明,就可以直接通过固定的引用变量来引用这些对象。下表列出了所有隐含对象的引用变量和类型之间的对应关系。
请求转发
JSP采用jsp:forward标签来实现请求转发,转发的目标组件可以为HTML文件、JSP文件或者Servlet。jsp:forward的语法是:
<jsp:forward page=“转发的目标组件的绝对URL或者相对URL”/>