Jsp学习——filter的使用

Posted on 2011-12-21 02:15  无忧consume  阅读(253)  评论(0编辑  收藏  举报

一、servlet的生命周期

在《JSP学习 —— 开篇:JSP,servlet容器,Tomcat,servlet容器之间的关系》一文中,我已经对servlet的生命周期进行了简单阐述,现在,就来进行详细阐述:servlet其实就是一个Java类,它负责响应和处理页面消息。它的实例化方式有两种:一种是当web应用启动一开始,tomcat就对servlet进行初始化;另一种是当客户端请求一个servlet时,对应的servlet进行创建;创建时调用HttpServlet的Init(或用户自己重写的Init)函数进行初始化,之后调用service函数进行消息响应,最后调用destory方法进行收尾处理。对于其何时创建,如何创建,都不是由我们来控制的,而是由容器根据配置文件自己进行创建。

事实上,在标准MVC结构中,servlet只充当Control部分,它从来不对页面进行输出处理,也不进行业务逻辑处理,只是将页面消息进行对应的后台处理后(期间会和Model打交道),进行简单的页面跳转。

对于servlet类的配置,其实只要注意两点就足够了:一是指定servlet类名,二是指定该类要处理的动作。

 

  1. <pre name="code" class="html">  <servlet>  
  2.         <servlet-name>myServlet</servlet-name>  
  3.         <servlet-class>com.cancique.dao.LoginServlet</servlet-class>  
  4.   </servlet>  
  5.  <servlet-mapping>  
  6.         <servlet-name>myServlet</servlet-name>  
  7.         <url-pattern>/login</url-pattern>  
  8.   </servlet-mapping>  

对于sevlet的名字,暂时我们可以随意指定,对于只有一个servlet类的Web应用而言,是没必要注意的。

 

要注意而且需要特别注意的时servlet-class和url-pattern,servlet-class指定servlet的类名,类名必须包含完整的包前缀,而url指定要处理的动作名,如:我在这里打算处理一个表单请求的action,

 

  1. <form action = "login" id = "login" method = "post">  

要处理的action必须和url-pattern相同,否则servlet不能处理我们提交的请求,运行时会出错。

 

二、load-on-startup Servlet

一般来说,容器会将绝大多数servlet类的初始化都将在页面进行请求之后,然后根据请求找到对应的servlet再初始化,那么如果我们想将一个servlet类在WEB应用启动后尽早的执行初始化,那么只有靠load-on-startup配置参数了。这个配置参数同servlet的配置参数一起配置,它的参数值是个整型值,赋给它的值越小,它就越先初始化。

 

  1. <servlet>  
  2.         <servlet-name>myServlet</servlet-name>  
  3.         <servlet-class>com.cancique.dao.LoginServlet</servlet-class>  
  4.                 <load-on-startup>1</load-on-startup>  
  5.  </servlet>  
  6.  <servlet-mapping>  
  7.         <servlet-name>myServlet</servlet-name>  
  8.         <url-pattern>/login</url-pattern>  
  9.   </servlet-mapping>  

 

三、访问servlet的配置参数

我们在配置servlet时,还可以配置一些运行时用到的参数,这种参数可以通过ServletConfig类来解析,看起来和我前面讲到的《JSP学习——JSP基础知识(二)

 

》里面提到的application对象解析配置文件中数据库连接信息的参数很类似,不同的是application可以在任何地方进行解析,而ServletConfig对象只能在servlet中进行解析。比如:如果我们在servlet中需要得到数据库的连接信息以初始化DAO对象,那么可以在web.xml的servlet配置信息中增加一些配置参数:

 

 

  1. <servlet>  
  2.         <servlet-name>myServlet</servlet-name>  
  3.         <servlet-class>com.cancique.dao.LoginServlet</servlet-class>  
  4.         <init-param>  
  5.             <param-name>driver</param-name>  
  6.             <param-value>com.mysql.jdbc.Driver</param-value>  
  7.         </init-param>  
  8.         <init-param>  
  9.             <param-name>url</param-name>  
  10.             <param-value>jdbc:mysql://localhost:3306/test_db</param-value>  
  11.         </init-param>  
  12.         <init-param>  
  13.             <param-name>user</param-name>  
  14.             <param-value>root</param-value>  
  15.         </init-param>  
  16.         <init-param>  
  17.             <param-name>pass</param-name>  
  18.             <param-value>900622</param-value>  
  19.         </init-param>  
  20. </servlet>  
  21.   
  22. <servlet-mapping>  
  23.         <servlet-name>myServlet</servlet-name>  
  24.         <url-pattern>/login</url-pattern>  
  25. </servlet-mapping>  

在需要用到这些参数的servlet类中,我们可以通过ServletConfig对象来解析:

 

  1. ServletConfig config = getServletConfig();  
  2. String driver = config.getInitParameter("driver");  
  3. String url = config.getInitParameter("url");  
  4. String user = config.getInitParameter("user");  
  5. String pass = config.getInitParameter("pass");  
  6. DbDao dao = DbDao.instance(driver,url,user,pass);  

 

四、综合应用:servlet作为MVC架构中Control层的实例——一个简单的登录验证

index.jsp页面代码如下:

 

  1. <%@ page language="java" import="java.util.*" errorPage="error.jsp"%>  
  2. <%@ page pageEncoding="gb2312"%>  
  3. <%@page import="java.sql.SQLException"%>  
  4. <%@page import="java.net.ConnectException"%>  
  5. <%@page import="java.sql.DriverManager"%>  
  6. <%@page import="java.sql.*" %>  
  7. <html>  
  8.   <body>  
  9.         <form action = "login" id = "login" method = "post">  
  10.             user name:<input type = "text" name = "username"><hr>  
  11.             user password:<input type = "text" name = "userpassword"><hr>  
  12.             <input type = "submit" value = "submit"><br>  
  13.         </form>  
  14.    </body>  
  15. </html>  


error.jsp页面代码如下:

 

 

  1. login failed!  

success.jsp页面代码如下:

 

 

  1. login successful!  

LoginServlet类代码如下:

 

 

  1. package com.cancique.dao;  
  2.   
  3. import java.io.IOException;  
  4. import java.sql.*;  
  5.   
  6. import javax.servlet.RequestDispatcher;  
  7. import javax.servlet.ServletConfig;  
  8. import javax.servlet.ServletException;  
  9. import javax.servlet.http.HttpServlet;  
  10. import javax.servlet.http.HttpServletRequest;  
  11. import javax.servlet.http.HttpServletResponse;  
  12. import javax.servlet.http.HttpSession;  
  13.   
  14. public class LoginServlet extends HttpServlet{  
  15.     public void service(HttpServletRequest request,  
  16.             HttpServletResponse response)  
  17.     {  
  18.         RequestDispatcher rd; //请求转发  
  19.         String username = request.getParameter("username");  
  20.         String userpassword = request.getParameter("userpassword");  
  21.         String errMsg = null;  
  22.         try  
  23.         {  
  24.             ServletConfig config = getServletConfig();  
  25.             String driver = config.getInitParameter("driver");  
  26.             String url = config.getInitParameter("url");  
  27.             String user = config.getInitParameter("user");  
  28.             String pass = config.getInitParameter("pass");  
  29.             DbDao dao = DbDao.instance(driver,url,user,pass);  
  30.             String sql = "select userpassword from user_information where username = '" + username + "'";  
  31.             ResultSet resultSet = dao.query(sql);  
  32.               
  33.             if(resultSet.next())  
  34.             {  
  35.                 if(resultSet.getString("userpassword").equals(userpassword))  
  36.                 {  
  37.                     HttpSession session = request.getSession(true);  
  38.                     session.setAttribute("username", username);  
  39.                     rd = request.getRequestDispatcher("/success.jsp");  
  40.                     rd.forward(request, response);  
  41.                 }  
  42.                 else  
  43.                 {  
  44.                     errMsg +="密码错误!";  
  45.                 }  
  46.             }  
  47.             else  
  48.             {  
  49.                 errMsg += "用户名错误!";  
  50.             }  
  51.         }catch(Exception e)  
  52.         {  
  53.             rd = request.getRequestDispatcher("/error.jsp");  
  54.             request.setAttribute("exception""业务异常");  
  55.             try {  
  56.                 rd.forward(request, response);  
  57.             } catch (ServletException e1) {  
  58.                 e1.printStackTrace();  
  59.             } catch (IOException e1) {  
  60.                 e1.printStackTrace();  
  61.             }  
  62.         }  
  63.     }  
  64. }  

DbDao类代码如下(使用Singleton设计模式):

 

 

  1. package com.cancique.dao;  
  2.   
  3. import java.sql.*;  
  4.   
  5.   
  6. public class DbDao {  
  7.     private static DbDao dao;  
  8.     private Connection conn;  
  9.     private String driver;  
  10.     private String url;  
  11.     private String username;  
  12.     private String pass;  
  13.       
  14.     private DbDao()  
  15.     {}  
  16.       
  17.     private DbDao(String driver,String url,  
  18.             String username,String pass)  
  19.     {  
  20.         this.driver = driver;  
  21.         this.url = url;  
  22.         this.username = username;  
  23.         this.pass = pass;  
  24.     }  
  25.   
  26.     public static DbDao getDao() {  
  27.         return dao;  
  28.     }  
  29.   
  30.     public static void setDao(DbDao dao) {  
  31.         DbDao.dao = dao;  
  32.     }  
  33.   
  34.     public String getDriver() {  
  35.         return driver;  
  36.     }  
  37.   
  38.     public void setDriver(String driver) {  
  39.         this.driver = driver;  
  40.     }  
  41.   
  42.     public String getUrl() {  
  43.         return url;  
  44.     }  
  45.   
  46.     public void setUrl(String url) {  
  47.         this.url = url;  
  48.     }  
  49.   
  50.     public String getUsername() {  
  51.         return username;  
  52.     }  
  53.   
  54.     public void setUsername(String username) {  
  55.         this.username = username;  
  56.     }  
  57.   
  58.     public String getPass() {  
  59.         return pass;  
  60.     }  
  61.   
  62.     public void setPass(String pass) {  
  63.         this.pass = pass;  
  64.     }  
  65.       
  66.     public void getConnection() throws ClassNotFoundException, SQLException  
  67.     {  
  68.         if(conn == null)  
  69.         {  
  70.             Class.forName(this.driver);  
  71.             conn = DriverManager.getConnection(url, username, pass);  
  72.         }  
  73.     }  
  74.       
  75.     public static DbDao instance(String driver,String url,  
  76.             String username,String pass)  
  77.     {  
  78.         if(dao == null)  
  79.         {  
  80.             dao = new DbDao(driver,url,username,pass);  
  81.         }  
  82.         return dao;  
  83.     }  
  84.       
  85.     public boolean insert(String sql) throws ClassNotFoundException, SQLException  
  86.     {  
  87.         getConnection();  
  88.         Statement statement = conn.createStatement();  
  89.         if(statement.executeUpdate(sql) != -1)  
  90.         {  
  91.             return false;  
  92.         }  
  93.         return true;  
  94.     }  
  95.       
  96.     public ResultSet query(String sql) throws ClassNotFoundException, SQLException  
  97.     {  
  98.         getConnection();  
  99.         Statement statement = conn.createStatement();  
  100.         return statement.executeQuery(sql);  
  101.     }  
  102.       
  103.     public void delete(String sql) throws ClassNotFoundException, SQLException  
  104.     {  
  105.         getConnection();  
  106.         Statement statement = conn.createStatement();  
  107.         statement.executeUpdate(sql);  
  108.     }  
  109.       
  110.     public void update(String sql) throws ClassNotFoundException, SQLException  
  111.     {  
  112.         getConnection();  
  113.         Statement statement = conn.createStatement();  
  114.         statement.executeUpdate(sql);  
  115.     }  
  116. }  

web.xml配置文件信息如下:

 

 

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <web-app version="2.5"   
  3.     xmlns="http://java.sun.com/xml/ns/javaee"   
  4.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
  5.     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   
  6.     http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">  
  7.   <welcome-file-list>  
  8.     <welcome-file>index.jsp</welcome-file>  
  9.   </welcome-file-list>  
  10.   <servlet>  
  11.         <servlet-name>myServlet</servlet-name>  
  12.         <servlet-class>com.cancique.dao.LoginServlet</servlet-class>  
  13.         <init-param>  
  14.             <param-name>driver</param-name>  
  15.             <param-value>com.mysql.jdbc.Driver</param-value>  
  16.         </init-param>  
  17.         <init-param>  
  18.             <param-name>url</param-name>  
  19.             <param-value>jdbc:mysql://localhost:3306/test_db</param-value>  
  20.         </init-param>  
  21.         <init-param>  
  22.             <param-name>user</param-name>  
  23.             <param-value>root</param-value>  
  24.         </init-param>  
  25.         <init-param>  
  26.             <param-name>pass</param-name>  
  27.             <param-value>900622</param-value>  
  28.         </init-param>  
  29.         <load-on-startup>1</load-on-startup>  
  30.   </servlet>  
  31.     
  32.   <servlet-mapping>  
  33.         <servlet-name>myServlet</servlet-name>  
  34.         <url-pattern>/login</url-pattern>  
  35.   </servlet-mapping>  
  36. </web-app>  

 

Copyright © 2024 无忧consume
Powered by .NET 8.0 on Kubernetes