Servlet开发
---恢复内容开始---
1:Servlet对于开发者最重要的就是可以用来处理客户端传来的HTTP请求,并返回一个响应。
Servlet需要在web.xml中进行描述,例映射执行Servlet的名字,配置Servlet类,初始化参数,
进行安全配置,URL映射,设置启动优先权,可以生成多种输出,如HTML/TXT等!
注:Servlet可以接收多个客户端的请求,为每一个请求分配一个线程,并将结果传递到多个客户端上,可以作为多参与者的游戏服务!
Servlet之间可以通过共享数据实现数据库连接池,能方便的管理用户的请求,简化session,以及获取前一页信息的操作。
2:Servlet的生命周期
Servlet部署在容器中,其生命周期由Servlet容器控制。
1)客户端请求Servlet服务或web服务器启动时,容器加载一个Servlet类。
2)容器根据客户请求创建一个或多个Servlet对象实例,并将这些实例加入到Servlet实例池中。
3)容器调用Servlet的初始化方法init()进行初始化,需要给init方法传入一个ServletConfig对象,其包含了初始化参数和容器环境的信息,并负责向Servlet传递数据,若失败抛出ServletException。
4)容器利用HttpServletRequest和HttpServletResponse对象,封装从web客户端接收到的HTTP请求,和有Servlet产生的响应。
5)把request/response对象传递到service()方法,service方法被多次调用,各调用运行在不同的线程中,互不干扰。
6)Servlet读取request对象中的请求数据,访问来自HttpSessio或Cookie对象的状态信息,进行处理,并生成HttpResponse响应数据。
7)当web服务器或容器关闭时,会调用destory()方法关闭所有打开的资源,并进行关闭前的一些处理。
3: Servlet API
1:javax.servlet.Servlet接口
public void init(ServletConfig arg0) throws ServletException 初始化时被调用,生命周期内被调用一次,可以设置数据库连接,读取Servlet设置信息等。
public String getServletInfo() 获取Servlet信息。
public ServletConfig getServletConfig() 返回ServletConfig对象
public void service(ServletRequest request,ServletResponse response) throws ServletException ,IOExecption . 处理请求,产生响应
public void destroy() 当Servlet被销毁时,web容器会调用这个方法,可以完成断开与数据库的连接,保存重要数据等。
2:javax.servlet.GenericServlet类
抽象类,提供了对Servlet接口的基本实现。
3:javax.servlet.ServletConfig接口
public String getInitParameter(String arg) 根据初始化变量名称返回字符串值
public Enumeration getInitParameterNames() 返回所有初始化变量的枚举对象
public ServletContext getServeletConfig()
4:javax.servlet.http.HttpServlet类
public void doGet(HttpServletRequest request,HttpServletResponse response)
doPost(...)
doPut(...) 上传数据或文件
5:javax.servlet.http.HttpServeltRequest接口
6:javax.servlet.http.HttpServletResponse接口
Servlet应用
创建步骤:
1)继承HttpServelt抽象类
2)覆盖doget,dopost方法
3)封装HTTP请求信息,request
4) 生成http响应,response
Servlet配置
web.xml中
<servlet>
<description>ServletDemo</description>
<display-name>Servlet</display-name>
<servlet-name>ServletDemo1</servlet-name>
<servlet-class>com.servlet.DemoServlet</servlet-class>
//对JSP文件
<jsp-file>index.jsp</jsp-file>
<init-param> //配置初始化参数,可以在其中配置数据库的驱动参数
<param-name>name</param-name>
<param-value>value</param-value>
</init-param>
<load-on-startup>10/20/AnyTime</load-on-startup> //装载优先权
</servlet>
<Servlet-mapping>
<servlet-name>ServletDemo1</servlet-name>
<url-pattern>/DemoServlet</url-pattern>
</servlet-mapping>
Servlet中实现页面的转发
doget(..){
RequestDispatcher requestDispatcher=request.getRequestDispatcher(foward.jsp);
requestDispatcher.foward(request,response);
}
利用JavaBean由Servlet向jsp传递数据
Bean:
1 public class User{ 2 3 private String name; 4 private int age; 5 6 public String getName(){ 7 return this.name; 8 } 9 10 public void setName(String name){ 11 this.name=name; 12 } 13 public int getAge(){ 14 return this.age; 15 } 16 17 public void setAge( int age){ 18 this.age=age; 19 } 20 }
Servlet:
1 import java.util.*; 2 import java.io.*; 3 import javax.servlet.*; 4 import javax.servlet.http.*; 5 6 public class passServlet extends HttpServlet{ 7 8 public void doGet(HttpServletRequest request,HttpSrevletResponse response)throws ServletException,IOException{ 9 10 request.setCharacterEncoding("UTF-8"); 11 12 User user=new User(); 13 user.setName(request.getParameter("name")); 14 user.setAge(request.getParameter("age")); 15 request.setAttribute("user",user); 16 this.getServletConfig().getServletContext().getRequestDispatcher("????").foward(request,response); 17 18 } 19 }
JSP
1 <%@page import="User"%> 2 <% User user=(User)request.getAttribute("user");%> 3 4 user.getName; 5 user.getAge();
Servlet过滤器
Servlet过滤器可以截取客户端的请求,并作出处理,主要用来,限制用户访问某些资源,在处理请求时提前处理某些资源,验证客户是否来自可信网络,对提交的数据进行统一编码,从系统里获取配置信息,过滤客户的非法词汇,验证客户是否登录。
javax.servlet.Filter接口
public void init(FilterConfig filterConfig) throws ServletException 过滤器初始化(容器启动时初始化,通过FilterConfig获取配置参数)
public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain)throws ServletExcption ,IOException 完成具体的过滤操作,通过过滤链继续往下传递。
public void destroy()销毁过滤器
javax.servlet.FilterChain接口
主要作用是将用户的请求向下传递给其他的过滤器或者Servlet.
public void doFilter(ServletRequest request,ServletResponse response) throws IOException,ServletException
过滤器的配置 (可对一个或多个目录过滤,增加过滤的路径)
web.xml
<filter>
<filter-name>SimpleFilter</filter-name>
<filter-class>com.SimpleFilter</filter-class>
<init-param>
<param-name>name</param-name>
<param-value>value</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>SimpleFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
例:使用过滤器验证用户身份
创建POJO,User类。
JSP页面:
<%@page import="com.User"%> <% request.setCharacterEncoding("UTF-8"); User user=new User(); user.setName(request.getParameter("name")); user.setPassword(request.getParameter("password")); session.setAttribute("user",user); response.sendRedirect("URL"); %>
Filter:
import...
1 public class ValidateFilter extends HttpServlet implements Filter{ 2
3 privata FilterConfig filterConfig;
4 5 public void init(FliterConfig filterConfig)throws ServletException{ 6 this.servletConfig=servletCongfig; 7 8 } 9 public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain) throws ServletException,IOException{ 10 HttpSession session=((HttpServletRequst)request).getSession(); 11 response.setCharacterEncoding("UTF-8"); 12 if(session.getAttribute("user")=null){ 13 PrintWriter out=request.getWriter(); 14 out.print("<script language=javascript>alert("没有登录")"); 15 16 }else{ 17 chain.doFilter(request,response); 18 } 19 20 } 21 }
在web.xml配置过滤器,及映射的过滤路径。
例:字符串过滤
可以定义一个类将网页内容变为字符串,然后对字符串比较
if(str.indexOf("过滤的词")>0){
newStr=str.replace("过滤掉的词",“*******”);
}
例:编码过滤
init(..){
this.charSet=config.getParameter("charSet");
}
doFilter(..){
request.setCharacterEncoding(this.charSet);
}
Servlet监听器
监听由于web应用中状态的改变而引起的Servlet容器的相应事件,然后接受并处理这些事件。由容器管理。
1:ServletContext监听
1)javax.servlet.ServletContextListener接口 Servlet上下文监听
方法:[1] public void contextInitialized(ServletContextEvent event) 容器启动时触发
[2] public void contextDestroryed(ServletContextEvent event) 容器销毁时触发
2) javax.servlet.ServletContextEvent类
方法:[1] public ServletContext getServletContext()
2:Servlet上下文属性监听
1) javax.servlet.ServletContextAttributeListener接口 Servlet上下文属性监听
方法:[1]public void attributeAdded(ServletContextAttributeEvent event) application属性范围内属性增加 时启动
[2] public void attributeReplaced(ServletContextAttributeEvent event)
[3]public void attributeRemoved(ServletContextAttributeEvent event)
2) javax.servlet.ServletContextAttributeEvent
方法:[1]public String getName() 取得设置的属性名
[2]public Object getValue() 取得设置的属性值
3:HTTP会话监听
1)javax.servlet.http.HttpSessionListener接口 session状态监听
方法:[1]public void sessionCreated(HttpSessionEvent event) session创建时调用
[2]public void sessionDestroyed(HttpSessionEvent event)
2)javax.servlet.http.HttpSessionEvent类
方法:[1] public HttpSession getSession()
3)javax.servlet.http.HttpSessionAttributeListener接口
方法:[1]public void attributeAdded(HttpSessionBindingEvent event)
[2] public void attributeReplaced(HttpSessionBindingEvent event)
[3]public void attributeRemoved(HttpSessionBindingEvent event)
4)javax.servlet.http.HttpSessionBindingEvent类
方法:[1]public HttpSession getSession()
[2]public String getName()
[3]public Object getValue()]
5) javax.servlet.http.HttpSessionBindingListener接口
通过该接口实现的监听程序可以不用配置而直接使用
方法:[1]public void valueBound(HttpSessionBindingEvent event)
[2]public void valueUnbound(HttpSessionBindingEvent event)
Servlet请求监听
javax.servlet.ServletRequestListener
javax.servlet.ServletRequestEvent
javax.servlet.ServletRequestAttributeListener
javax.servlet.ServletRequestAttributeEvent
监听器配置
<listener>
<listener-class>com.*.class</listener-class>
</listener>
实例:在线统计