servlet
servlet是用Java语言编写的、应用于web服务器端的扩展技术[QL1] ,servlet先于JSP产生[QL2] ,可以方便地对web应用中的http请求进行处理。JSP的效率是低于servlet的执行效率。
[QL1]sun公司提供的一门用于开发动态web资源的技术。
[QL2]JSP是因为servlet担任了过多的职责造成维护困难,继而在servlet上产生的新的技术。
概述
Java编写的类
实现了servlet 接口
主要用于处理各种业务逻辑
HttpServlet在实现Servlet接口时,覆写了service方法。一般情况下,在创建servlet的时候,不会再次复写service方法,而是直接用doGet和doPost方法 。
GenericServlet对象是一个抽象类,他分别实现了上述的3个接口,并为servlet接口及ServletConfig接口提供了部分实现。但是其中http请求处理进行实现,这一操作由它的子类httpServlet进行实现。
serializable是java.io包中的序列化接口;servlet对象、servletConfig对象定义了servlet的基本方法并封装了servlet的相关配置信息。
技术特点
功能强大[QL1]
性能高效[QL2] [QL3] [QL4]
Java特点[QL5]
[QL1]即能使用Java API,也能够使用servlet API
[QL2]servlet在处理请求采用的是线程,而不是一个进程。web服务器会为每一个客户端的访问请求创建一个线程,并在这个线程上调用Servlet的service方法。
[QL3]但是如果访问了同一个资源的话,就有可能引发线程安全问题。
[QL4]采用synchronized关键字解决
[QL5]可移植、可扩展、安全性高
讨论
Servlet
Servlet程序是由WEB服务器调用,WEB服务器收到客户端的Servlet访问请求后:
①Web服务器首先检查是否已经装载并创建了该Servlet的实例对象。如果是则直接执行第④步,否则执行第②步。
②装载并创建该Servlet的一个实例对象。
③调用Servlet实例对象的init()方法。该方法可以加载配置信息,初始化servlet。
④创建一个用于封装HTTP请求消息的HttpServletRequest对象和一个代表HTTP响应消息的HttpServletResponse对象,然后调用Servlet的service()方法并将请求和响应对象作为参数传递进去。
Service()方法使用响应对象的方法根据客户提交的方式不同(可能是get或者post),Service()方法可能激活其他方法处理请求,如doget或dopost响应客户端请求。
⑤WEB应用程序被停止或重新启动之前,Servlet引擎将卸载Servlet,并在卸载之前调用Servlet的destroy()方法。
一般情况下,默认在doPost()中调用doGet()方法。这样不仅可以不用考虑客户端的提交方式,还可以尽可能多地命中调用方法get(因为一般情况下get是默认提交方法)
创建与配置
直接通过eclipse创建servlet文件[QL1]
创建Java文件并且手动继承HttpServlet虚类[QL2]
[QL1]ervlet的命名很重要,一般情况下会将包名按照类型或者功能来进行命名。在给servlet类进行命名的时候,一般情况下是功能名称加上servlet,表明当前类是servlet。
[QL2]继承了GenericServlet虚类,实现了service方法的覆写。
1.直接通过注解的方式配置servlet
@WebServlet("/LoginServlet")
如果映射地址为多个URL,则需要单独写出属性名和属性值,属性值按照数组[QL4] 的方式列出。
[QL3]在Servlet 3.0以前的版本中,只能在web.xml文件中配置Servlet。
[QL4]urlPatterns = { "/edit.jsp","/index.jsp", }
2.在web.xml中配置servlet
<servlet>
<servlet-name>ServletDemo1</servlet-name>
<servlet-class>包名.类名</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServletDemo1</servlet-name>
<url-pattern>/servlet/ServletDemo1[QL5] [QL6] [QL7] </url-pattern>
</servlet-mapping>
[QL5]同一个Servlet可以被映射到多个URL上,即多个<servlet-mapping>元素的<servlet-name>子元素的设置值可以是同一个Servlet的注册名。通过这种配置,多个路径都可以访问到同一个servlet。
[QL6]如果某个Servlet的映射路径仅仅为一个正斜杠(/),那么这个Servlet就成为当前Web应用程序的缺省Servlet。缺省Servlet用于处理所有其他Servlet都不处理的访问请求。
[QL7]在Servlet映射到的URL中也可以使用*通配符,但是只能有两种固定的格式:一种格式是"*.扩展名",另一种格式是以正斜杠(/)开头并以"/*"结尾。通配和缺省的servlet可以用来处理一些异常的请求和错误页面。
初始化与全局变量
参数配置
l 配置文件
<init-param>
<param-name>charset</param-name>
<param-value>UTF-8</param-value>
</init-param>
l 注解方式
initParams[QL8] 属性
[QL8]initParams = {
@WebInitParam(name ="username", value = "zhangsan", description = "默认名称"),
@WebInitParam(name ="password", value = "123456", description = "默认密码")
参数获取
private ServletConfigconfig;
public voidinit(ServletConfig config) throws ServletException {
this.config = config;
}
String paramVal =this.config.getInitParameter("name");//获取指定的初始化参数
全局参数的配置和获取
<context-param>
<param-name>init-name</param-name>
<param-value>init-value</param-name>
</context-param>
@Override
public void init(ServletConfig config) throwsServletException {
this.config = config;
String value= config.getServletContext[QL9] ().getInitParameter("name");
}
[QL9]首先获得servletContext,然后再调用初始化参数获取方法获取参数值。
开发步骤
必要的头部信息处理(禁止缓存、设置响应头等);
编码处理(对于有参数的情况);
接收JSP页面传递的参数(对于有参数的情况);
对获得的参数进行某些必要的处理(如异常判断、类型转换等);
将接收到的参数存入值JavaBean(对于存在复杂数据的情况);
实例化工具类JavaBean并进行参数传递;
定义变量接收工具类JavaBean的处理结果(对于有返回结果的情况);
将处理结果存储在适合的作用域中(注意作用域的选择);
执行请求转发或者是重定向,将处理结果展示在显示层(注意选择转发方式);
上述过程如果存在不确定因素,记得使用try catch进行异常捕获。