关于Servlet与JSP
2021-02-09 01:15
标签:依据 条件 des java代码 inactive 初始化 过滤 事件 flag Servlet是sun公司制订的一种用来扩展web服务器功能的组件规范。 早期的web服务器(比如apache web server,微软的 iis)只能够处理静态资源(即需要事先将html文件写好),不能够处理动态资源的请求(即需要依据请求参数然后进行计算,生成相应的页面)。 为了让这些web服务器能够处理动态资源的请求,需要扩展它们的功能。早期使用的是cgi技术(common gateway interface),可以使用很多语言,比如perl,c等来开发cgi程序。 但是cgi程序有几个问题,比如开发比较复杂(因为需要程序员自己去分析请求参数)、性能不佳(因为当web服务器收到请求之后,会启动一个cgi进程来处理请求),还有cgi程序依赖平台,可移植性不好。 现在,可以使用servlet来扩展。当浏览器将请求发送给web服务器(比如,apache web server),web服务器会向servlet容器发送请求,servlet容器负责解析请求数据包, 当然,也包括网络通讯相关的一些处理,然后,将解析之后的数据交给servlet来处理(servlet只需要关注具体的业务处理,不用关心网络通讯相关的问题)。 (1)组件: 符合一定规范,并且实现部分功能的软件模块。组件必须要部署到容器里面才能运行。 (2)容器: 符合一定规范,并且提供组件的运行环境的程序。 servlet容器其实也可以作为一个简单的web服务器来使用。 (1)将tomcat压缩文件解压到/home/soft01/opt/apache-tomcat5.5.23.tar.gz; (2)配置环境变量 ; (3)启动tomcat; 接下来,可以打开浏览器,输入http://localhost:8080 如果要关闭tomcat,可以使用: (1)先写一个java类,实现Servlet接口或者继承HttpServlet抽象类。 (2)编译; (3)打包; 即创建一个具有如下结构的文件夹 (4)部署 将(3)创建的文件夹拷贝到servlet容器特定的文件夹下面。注意:也可以将(3)创建的文件夹使用jar命令进行压缩,生成.war为后缀的文件,然后拷贝。 (5)启动servlet容器,访问servlet。http://ip:port/appname/url-pattern 比如,在浏览器地址栏输入: http://localhost:8080/firstweb/sayHello 比如,在浏览器地址栏输入:http://ip:port/web01/hello (1)浏览器依据ip,port建立与servlet容器之间的连接。 (2)浏览器将请求数据打包(即按照http协议的要求,将相关数据封装成一个数据包,一般称之为请求数据包)并发送给servlet容器。 (3)servlet容器解析请求数据包,并将解析之后得到的数据放到request对象上。同时,容器还要创建一个response对象。 (4)servlet容器依据请求资源路径(即/web06/hello)找到servlet的配置,然后创建servlet对象。 (5)容器接下来调用servlet对象的service方法,并且会将事先创建好的request对象和response对象作为service方法的参数传递给servlet对象。 (6)servlet可以通过request对象获得请求参数,进行相应的处理,然后将处理结果写到response对象上。 (7)容器读取response对象上的数据,然后将处理结果打包(响应数据包)并发送给浏览器。 (8)浏览器解析响应数据包,将返回的数据展现给用户。 比如,在浏览器地址栏输入:http://ip:port/appname/abc.html,浏览器会将"/appname/abc.html"作为请求资源路径发送给servlet容器。 (1)servlet容器会先假设访问的是一个servlet,会依据应用名(appname)找到应用所在的文件夹,然后找到web.xml文件。 (2)匹配 a.精确匹配(完全匹配): b.通配符匹配: 使用"*"来匹配任意长度的字符串。 比如: c.后缀匹配: 使用"*."开头,后接任意的字符串, 比如: (3)如果都不匹配,则容器认为访问的是一个静态资源文件(比如 html文件),然后容器会查找该文件,如果找到则返回,否则会返回404。 (4)一个servlet处理多种请求 使用后缀匹配模式,比如 分析请求资源路径,然后依据分析的结果分别进行不同的处理。String request.getRequestURI();//获得请求资源路径 servlet的生命周期的含义? servlet容器如何去创建servlet对象,如何给servlet对象分配资源,如何调用servlet对象的方法来处理请求,以及如何去销毁servlet对象的整个过程。 servlet生命周期的四个阶段: a.实例化,指的是容器调用servlet的构造器,创建servlet对象。 b.什么时候实例化? 情况1:容器收到请求之后才创建servlet对象。在默认情况下,容器只会为servlet创建唯一的一个实例。 情况2: 容器事先(容器启动时)将某些servlet(需要配置load-on-startup参数)对象创建好。load-on-startup参数值必须是 >=0的整数,越小,优先级(即先被实例化)越高。 a.初始化,指的是容器在创建好servlet对象之后,会立即调用servlet对象的init方法。 b.init方法: b1.init方法只会执行一次。 b2.GenericServlet已经实现了init方法,该方法会将容器创建好的ServletConfig对象作为参数传给init方法。 b3.ServletConfig对象提供了一个getInitParameter方法来访问servlet的初始化参数。 step1:在web.xml文件里面,使用 step2:String getInitParameter(String paraName); b4.如果GenericServlet的init方法提供的初始化操作不满足需要,可以override init()方法。 a.就绪指的是servlet对象可以接受调用了,容器收到请求之后,会调用servlet对象的service方法来处理。 b.HttpServlet已经实现了service方法,该方法会依据请求类型(get/post)分别调用doGet,doPost方法。 所以在写一个servlet时,有两种选择: 选择1:override HttpServlet的doGet,doPost方法。 选择2:override HttpServlet的service方法。 a.销毁指的是servlet容器在销毁servlet对象之前,会调用destroy方法。 b.destroy方法只会执行一次。 (1)Servlet接口 a.init(ServletConfig config) b.service(ServletRequest req,ServletResponse res) c.destroy() (2)GenericServlet抽象类:实现了Servlet接口中的init,destroy方法。 (3)HttpServlet抽象类:继承了GenericServlet抽象类,实现了service方法。 (4)ServletConfig接口:String getInitParameter(String paraName)。 (5)ServletRequest接口是HttpServletRequest的父接口,ServletResponse接口是HttpServletResponse的父接口。 一个web组件(servlet/jsp)将未完成的处理通过容器转交给另外一个web组件继续完成。常见的情况是: 一个servlet将数据处理完毕之后,转交给一个jsp去展现。 step1:绑订数据到request:request.setAttribute(String name,Object obj);//name:绑订名, obj:绑订值 step2:获得一个转发器:RequestDispatcher rd = request.getRequestDispatcher(String url);//url:要转发给哪一个web组件 step3:转发:rd.forward(request,response); step4:在转发的目的地,可以使用request.getAttribute方法获得绑订的数据,然后进行处理。Object request.getAttribute(String name);//如果name对应的值不存在,会返回null。 a.转发之前,先清空response对象中缓存的数据。 b.转发之前,不能够调用out.close()。 a.转发的目的地只能够是同一个应用内部的某个组件的地址。 b.转发之后,浏览器地址栏的地址不变。 a、转发的目的地只能是同一个应用内部某个组件的地址,而重定向的目的地是任意的。 b、转发之后,浏览器地址栏的地址不变,而重定向会变。 c、转发所涉及的各个web组件可以共享request对象,而重定向不可以。 d、转发是一件事情未做完,而重定向是一件事情已经做完。 (1)将异常抛给容器throw new ServletException(e); (2)编写一个错误处理页面,比如system_error.jsp (3)配置错误处理页面(让容器知道,当捕获到了相应的异常后,应该调用哪一个页面)。 即链接地址、表单提交地址、重定向、转发这四种情况下, 如何写正确的路径(地址)。 (1)什么是相对路径?不以"/"开头的路径; (2)什么是绝对路径?以"/"开头的路径; (3)如何写绝对路径?链接地址,表单提交地址,重定向的绝对路径应该从应用名开始写,而转发应该从应用名之后开始写。 //获得实际部署时的应用名String request.getContextPath(); (1)什么是状态管理?将浏览器与web服务器之间多次交互当做一个整体来看待,并且将多次交互所涉及的数据保存下来。 (2)如何进行状态管理? 第一大类:客户端状态管理技术:即将状态(也就是多次交互所涉及的数据)保存在客户端(浏览器)。 第二大类:服务器端状态管理技术:即将状态保存在web服务器端。 a.是一种客户端的状态管理技术。 b.当浏览器访问服务器的时候,服务器可以将少量的数据以set-cookie消息头的方式发送给浏览器,浏览器会将这些数据保存下来; 当浏览器再次访问服务器时,会将之前保存的这些数据以cookie消息头的方式发送给服务器。 Cookie c = new Cookie(String name,String value);//name:cookie的名称, value:cookie的值。 response.addCookie(c); Cookie[] request.getCookies();//如果没有任何的cookie,返回null。 String cookie.getName();//返回cookie的名称; String cookie.getValue();//返回cookie的值; cookie的值或者名称只允许出现合法的ascii字符串。 如果是中文,需要将中文转换成ascii字符串。 String URLEncoder.encode(String str,String code); String URLDecoder.decode(String str,String code); 默认情况下,浏览器会将cookie保存在内存里,只要浏览器不关闭,cookie会一直存在。 cookie.setMaxAge(int seconds); 注意: a.单位是秒。 b.当seconds > 0时,浏览器会将cookie保存在硬盘上, 当cookie保存的时间超过了seconds,则cookie会被浏览器删除。 当seconds
当seconds = 0时,删除cookie。 比如,要删除名称为userId的cookie: Cookie c = new Cookie("userId",""); c.setMaxAge(0); response.addCookie(c); a.session是服务器端的状态管理技术。 b.当浏览器访问服务器时,服务器会创建一个session对象(该对象有一个唯一的id号,称之为sessionId), 接下来,服务器在默认情况下,会使用set-cookie消息头将这个sessionId发送给浏览器,浏览器会将这个sessionId保存下来(内存); 当浏览器再次访问服务器时,会将sessionId使用cookie消息头发送给服务器,服务器依据这个sessionId就可以找到之前创建的session对象。 方式一: HttpSession s = request.getSession(boolean flag);//HttpSession是一个接口 当flag = true时:服务器会先检查请求当中是否有sessionId,如果没有,则创建一个session对象。 如果有sessionId,则服务器会依据sessionId查找对应的session对象,如果找到了,则返回。找不到,服务器会创建一个新的session对象。 当flag = false时:服务器会先检查请求当中是否有sessionId,如果没有,则返回null。 如果有sessionId,则服务器会依据sessionId查找对应的session对象,如果找到了,则返回,找不到,返回null。 方式二:HttpSession s = request.getSession();等价于request.getSession(true)。 String getId();//获得sessionId setAttribute(String name,Object obj);//绑订一个对象到session对象上。 Object getAttribute(String name);//获得绑订对象,如果不存在,返回null。 removeAttribute(String name);//解除绑订 服务器会将空闲时间过长的session对象删除掉。服务器默认的session超时限制一般是30分钟,可以修改这个默认的超时限制,比如,可以修改tomcat的web.xml文件。 修改之后需要重新启动tomcat服务器。也可以修改某个应用的web.xml。也可以通过编程的方式来修改超时的限制setMaxInactiveInterval(int seconds); sessino验证经常用于保护一些需要登录之后才能访问的资源。 比如,只有登录成功以后,才能访问main.jsp。 step1:登录成功以后,绑订一些数据到session对象上。 比如:session.setAttribute("user",user); step2:对于需要保护的资源,添加session验证的代码。 比如: (1)如果用户禁止cookie,服务器仍然会将sessionId以cookie的方式发送给浏览器,但是,浏览器不再保存这个cookie(即sessionId)了。 (2)如果想继续使用session,需要采取其它方式来实现。 sessionId的跟踪。可以使用url重写来实现sessionId的跟踪。 1).什么是url重写。 浏览器在访问服务器上的某个地址时,不能够直接写这个组件的地址,而应该使用服务器生成的这个组件的 地址。 比如, someServlet 错误! 应该 someServletencodeURL方法会在"some"后面添加sessionId。 a.response.encodeURL(String url); //encodeURL方法用于链接地址、表单提交地址。 比如:一.Servlet是什么
1、扩展web服务器功能
2、组件规范
3、安装tomcat(是一个servlet容器)
cd /home/soft01/apache-tomcat/bin
sh startup.sh或者sh catalina.sh run
cd /home/soft01/apache-tomcat/bin
sh shutdown.sh
4.如何写一个servlet
appname(应用名)
WEB-INF
classes(.class文件)
lib(.jar文件, lib文件夹可选)
web.xml(部署描述文件 url-pattern)
二.Servlet原理
1、Servlet运行原理
2、Servlet容器处理请求资源路径
3、Servlet的生命周期
(1)实例化
(2)初始化
(3)就绪
(4)销毁
4、Servlet生命周期相关的几个接口与类
5、转发
(1)什么是转发
(2)如何转发。
(3)编程需要注意的两个问题。
(4)转发的特点
(5)转发与重定向的区别
6、让容器来处理系统异常
error-page>
exception-type>javax.servlet.ServletExceptionexception-type>
location>/system_error.jsplocation>
error-page>
7、路径问题
>
8、状态管理
9、cookie
(1)什么是cookie?
(2)如何创建一个cookie?
(3)查询cookie
(4)编码问题
(5)cookie的生存时间
10、session (会话)。
(1)session是什么
(2)如何获得一个session对象
(3)HttpSession接口中提供的常用方法
(4)session的超时
session-config>
session-timeout>30session-timeout>
session-config>
(5)立即删除session:invalidate()。
11、session案例
(1)session验证
Object obj = session.getAttribute("user");
if(obj == null){
response.sendRedirect("login.jsp");//没有登录成功,或者因为session超时,服务器已经删除了之前的session对象。
}
(2)验证码:生成一个验证码,要求长度为5,并且随机从"A~Z,0~9"选取。
(3)用户禁止cookie以后,如果继续使用session。
(4)url重写
(5)如何进行url重写。
下一篇:【记录】TS和JS的区别