6.Servlet
引入:
Servlet是一个小的Java程序,该程序运行在Web 服务器中(Servlet必须要在Web服务器中运行),用于处理来自于 web 客户端(比如浏览器)的请求和响应。
Servlet有能力在每次不同时间阶段或者后台业务数据状态发生了改变,可以来处理这种动态的数据。
Servlet它是一个纯Java代码实现的。
Servlet是sun公司定义的一套请求web客户端请求和响应的规范。没有实现,具体的技术规范交给了web 服务器的厂商在实现
6.1Servlet开发流程
编写一个自定义的类让它去实现sun公司定义的Servlet接口
/**
* 1.自定义一个java 类。
2.实现一个Servlet接口
3.导入servlet-api.jar 包 (注意加入到类路径中)
*
*/
public class HelloServlet implements Servlet {
// 该方法就是来处理请求和响应的方法
public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
System.out.println("请求来了....");
}
在开发的web应用中的web.xml文件中去注册自定义的Servlet以及映射该Servlet的uri地址
![](https://img.haomeiwen.com/i9327494/87c8f45df28c8b7e.png)
6.2Servlet创建三种方式
第一种方式:自定义一个类实现Servlet接口
第二种方式:自定义一个类继承GenericServlet抽象类(因为该类实现了Servlet接口)
第三种方式:自定义一个类继承HttpServlet类
6.3Sevlet生命周期方法
Servlet对象实例默认情况下是由第一次请求来的时候才会被创建
Servlet对象实例创建的只有一次
Servlet对象实例是由tomcat Servlet容器完成创建
生命周期方法:(面试题)
public void service(ServletRequest req, ServletResponse res):该方法是处理请求和响应的
public void init(ServletConfig config):该方法是在servlet对象实例创建后就会执行的方法,该方法是由tomcat 相关的组件在调用,并且调用一次。
public void destroy():该方法会在应用从tomcat中卸载,tomcat服务器关闭的时候自动执行。
6.4 ServletConfig 对象详解
该对象是一个对Servlet描述信息的封装对象。
该对象不需要程序员手工创建,是由tomcat容器在servlet对象初始化的时候就会被创建。
该对象类型api方法介绍
getServletName() 该方法获取的是servlet-name标签中的值
getInitParameter(String key) 该方法可以获取指定的当前servlet 配置的初始化参数。
getInitParameterNames()该方法获取当前servlet配置的所有的key
getServletContext()该方法可以获取应用域对象ServletContext
注意获取servlet上下文初始化参数需要在web.xml文件中配置
![](https://img.haomeiwen.com/i9327494/700b1e8879af5829.png)
6.5ServletContext 对象详解
ServletContext是描述一个web 应用的上下文对象
ServletContext针对web 应用有且只要一个该对象
ServletContext对象是通过ServletConfig对象获取
ServletContext对象也是Servlet中的三大域对象之一(日后再说)
ServletContext对象既然是一个web 应用的上下文对象,所以可以通过该对象来获取web 应用上下文中的资源文件
ServletContext对象 api方法介绍
getInitParameter(String key):获取应用上下文初始化参数值
getRealPath(String 相对应用的路径path):获取资源化在磁盘上路径
getResourceAsStream(String 相对应用的路径path):获取资源并把资源转换成字节输入流
setAttribute(name, object);该方法可以把数据放入到一个map中。该map作用域是一个应用域
getAttribute(name); 该方法可以从map中获取值,该map作用域是一个应用域
6.6Servlet细节
Servlet是一个线程不安全的对象(面试题)
如果开发一个HelloServlet这样一个Servlet组件,发现Servlet只会在第一次请求来的时候创建一次,以后的请求不再创建该Servlet组件对象。所以可以了解到多个请求同一个servlet是共享的对象。然而,不同的请求可以理解成多个线程在操作同一分对象数据,所以就有可能出现线程并发的问题。
注意:所有将来的数据,不能暴露在servlet的成员变量位置,需要的话写在处理请求和响应的service方法中。
Servlet 创建时机
默认情况下Serlvet创建的时机是在第一次请求来的时候才会创建,所有如果有大量的servlet初始化化工作比较耗时的话,第一次访问者体验不好。要解决该问题,就要把创建servlet的时机提前,可以提前到应用发布的时候
![](https://img.haomeiwen.com/i9327494/345b34b206e03ae7.png)
映射路径问题
精确配置:/servlet1
通配符匹配:/* 匹配所有
后缀名匹配 : *.do
总结:精确配置的uri路径的优先级最高,精确配置可以和后缀名一起用/abc.java,
通配符不能喝后缀名一起用 /*.do 是错误的!!!
6.7Servlet请求流程
![](https://img.haomeiwen.com/i9327494/4d486061ebbaf8e6.png)
6.8HttpServlet对象详解 (掌握 、重点)
HttpServletRequest 对象详解
该对象继承了ServletRequest对象,能处理HTTP请求的Servlet
该对象是Servlet 容器创建的(tomcat服务器),帮助注入到生命周期方法中的service的形参上
该对象的api:
getParameter(String key)通过key获取请求参数
getMethod()该方法获取请求的请求方式
getRequestURI():获取请求的uri地址
getRequestURL():获取请求的url地址
getParameterNames():获取请求参数的key的集合
getParameterValues(String key):获取指定的请求参数的key获得一组值
HttpServletResponse 对象详解
该对象继承了ServletResponse对象,能处理HTTP请求的Servlet
该对象是Servlet 容器创建的(tomcat服务器),帮助注入到生命周期方法中的service的形参上
该对象的api:
getOutputStream():使用的字节流向web客户端进行响应 (响应任何的数据类型)
getWriter();使用的字符流向web客户进行响应 (响应文本数据类型)
以上的两个流对象不能同时使用,同时使用报错!!!
setCharacterEncoding("utf-8") : 响应数据指定码表来编码
setContentType("text/html;charset=utf-8") : 告诉浏览器使用指定的码表打开,该方法其实也具有setCharacterEncoding这个方法的特性,所有指定该方法就可以了。
6.9中文乱码问题
请求方式POST中文乱码处理:
HttpServletRequest对象中的setCharacterEncoding(String 码表),设置的码表要看提交参数的页面使用的什么的码表。
请求方式GET中文乱码处理:
修改tomcat服务器的码表,在tomcat7版本以下的服务器默认的码表是iso8859-1,tomcat7以上使用的utf-8.URIEncondig
![](https://img.haomeiwen.com/i9327494/f0fbb312ffcdd0de.png)
还有使用手工转码,详见代码
转发和重定向
转发技术:服务端行为,只能通过应用程序内部进行访问响应的资源,转发技术对应一次请求,浏览器地址没有发生变化,
转发过程中使用的 HttpServletRquest 、 HttpServletResponse对象是同一个对象
服务端行为:在填写路径的时候,不用带项目应用名称
重定向技术:客户端行为,通过浏览器发出请求访问资源,会至少发出两次请求,浏览器地址会发生改变,
重定向过程中使用的 HttpServletRquest 、 HttpServletResponse对象不是同一个对象,
原因是,每一次请求,tomcat 会new 出新的 HttpServletRquest 、 HttpServletResponse
举例:
事件:请假
事件源:陈辽逊
处理器(方法处理):易元靖(班主任)
中间人:张老师
转发:
![](https://img.haomeiwen.com/i9327494/191c448b4f3f50fe.png)
重定向:
![](https://img.haomeiwen.com/i9327494/8669585db2672b5b.png)
总结:serlvet 应用程序中有三大域对象(域对象主要用途是保存数据)
ServletContext(application应用域):该对象在Servlet应用程序中只有一份,作用范围最大
HttpServletResquest对象(request 请求域) :该对象每次请求对应一个新的请求对象,注意,如果在使用该对象保存数据,有可能会数据丢失(使用了重定向),作用域范围针对一次请求有效。
HttpSession 对象(session 会话域) :该对象在浏览器不关闭的情况下产生一个HttpSession对象,作用的范围在一次会话有效。。(具体日后再说)
作用范围大小排序: ServletContext > HttpSession > HttpServletResquest
request.getParameter() vs 域对象.getAttribute()
request.getParameter() 是用于获取请求参数的(表单提交的参数、a标签后面带的参数等)!!!
域对象.getAttribute() 是用于获取域对象中的setAttribute(String key,Object value)保存的数据
域对象.setAttribute ---- 对应相应的域对象的getAttribute()来获取.
HttpServletResquest.setAttribute ----- HttpServletResquest.getAttribute
HttpSession.setAttribute ----- HttpSession.getAttribute
ServletContext.setAttribute ------ ServletContext.getAttribute
网友评论