Jsp学习——servlet详解

一、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类名,二是指定该类要处理的动作。

  <servlet>
  		<servlet-name>myServlet</servlet-name>
  		<servlet-class>com.cancique.dao.LoginServlet</servlet-class>
  </servlet>
 <servlet-mapping>
  		<servlet-name>myServlet</servlet-name>
  		<url-pattern>/login</url-pattern>
  </servlet-mapping>

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

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

<form action = "login" id = "login" method = "post">
要处理的action必须和url-pattern相同,否则servlet不能处理我们提交的请求,运行时会出错。

二、load-on-startup Servlet

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

<servlet>
  		<servlet-name>myServlet</servlet-name>
  		<servlet-class>com.cancique.dao.LoginServlet</servlet-class>
                <load-on-startup>1</load-on-startup>
 </servlet>
 <servlet-mapping>
  		<servlet-name>myServlet</servlet-name>
  		<url-pattern>/login</url-pattern>
  </servlet-mapping>

三、访问servlet的配置参数

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

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

  <servlet>
  		<servlet-name>myServlet</servlet-name>
  		<servlet-class>com.cancique.dao.LoginServlet</servlet-class>
  		<init-param>
  			<param-name>driver</param-name>
  			<param-value>com.mysql.jdbc.Driver</param-value>
  		</init-param>
  		<init-param>
  			<param-name>url</param-name>
  			<param-value>jdbc:mysql://localhost:3306/test_db</param-value>
  		</init-param>
  		<init-param>
  			<param-name>user</param-name>
  			<param-value>root</param-value>
  		</init-param>
  		<init-param>
  			<param-name>pass</param-name>
  			<param-value>900622</param-value>
  		</init-param>
  </servlet>
  
  <servlet-mapping>
  		<servlet-name>myServlet</servlet-name>
  		<url-pattern>/login</url-pattern>
  </servlet-mapping>

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

			ServletConfig config = getServletConfig();
			String driver = config.getInitParameter("driver");
			String url = config.getInitParameter("url");
			String user = config.getInitParameter("user");
			String pass = config.getInitParameter("pass");
			DbDao dao = DbDao.instance(driver,url,user,pass);

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

index.jsp页面代码如下:

<%@ page language="java" import="java.util.*" errorPage="error.jsp"%>
<%@ page pageEncoding="gb2312"%>
<%@page import="java.sql.SQLException"%>
<%@page import="java.net.ConnectException"%>
<%@page import="java.sql.DriverManager"%>
<%@page import="java.sql.*" %>
<html>
  <body>
  		<form action = "login" id = "login" method = "post">
  			user name:<input type = "text" name = "username"><hr>
  			user password:<input type = "text" name = "userpassword"><hr>
  			<input type = "submit" value = "submit"><br>
  		</form>
   </body>
</html>

error.jsp页面代码如下:

login failed!
success.jsp页面代码如下:

login successful!
LoginServlet类代码如下:

package com.cancique.dao;

import java.io.IOException;
import java.sql.*;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class LoginServlet extends HttpServlet{
	public void service(HttpServletRequest request,
			HttpServletResponse response)
	{
		RequestDispatcher rd; //请求转发
		String username = request.getParameter("username");
		String userpassword = request.getParameter("userpassword");
		String errMsg = null;
		try
		{
			ServletConfig config = getServletConfig();
			String driver = config.getInitParameter("driver");
			String url = config.getInitParameter("url");
			String user = config.getInitParameter("user");
			String pass = config.getInitParameter("pass");
			DbDao dao = DbDao.instance(driver,url,user,pass);
			String sql = "select userpassword from user_information where username = '" + username + "'";
			ResultSet resultSet = dao.query(sql);
			
			if(resultSet.next())
			{
				if(resultSet.getString("userpassword").equals(userpassword))
				{
					HttpSession session = request.getSession(true);
					session.setAttribute("username", username);
					rd = request.getRequestDispatcher("/success.jsp");
					rd.forward(request, response);
				}
				else
				{
					errMsg +="密码错误!";
				}
			}
			else
			{
				errMsg += "用户名错误!";
			}
		}catch(Exception e)
		{
			rd = request.getRequestDispatcher("/error.jsp");
			request.setAttribute("exception", "业务异常");
			try {
				rd.forward(request, response);
			} catch (ServletException e1) {
				e1.printStackTrace();
			} catch (IOException e1) {
				e1.printStackTrace();
			}
		}
	}
}
DbDao类代码如下(使用Singleton设计模式):

package com.cancique.dao;

import java.sql.*;


public class DbDao {
	private static DbDao dao;
	private Connection conn;
	private String driver;
	private String url;
	private String username;
	private String pass;
	
	private DbDao()
	{}
	
	private DbDao(String driver,String url,
			String username,String pass)
	{
		this.driver = driver;
		this.url = url;
		this.username = username;
		this.pass = pass;
	}

	public static DbDao getDao() {
		return dao;
	}

	public static void setDao(DbDao dao) {
		DbDao.dao = dao;
	}

	public String getDriver() {
		return driver;
	}

	public void setDriver(String driver) {
		this.driver = driver;
	}

	public String getUrl() {
		return url;
	}

	public void setUrl(String url) {
		this.url = url;
	}

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getPass() {
		return pass;
	}

	public void setPass(String pass) {
		this.pass = pass;
	}
	
	public void getConnection() throws ClassNotFoundException, SQLException
	{
		if(conn == null)
		{
			Class.forName(this.driver);
			conn = DriverManager.getConnection(url, username, pass);
		}
	}
	
	public static DbDao instance(String driver,String url,
			String username,String pass)
	{
		if(dao == null)
		{
			dao = new DbDao(driver,url,username,pass);
		}
		return dao;
	}
	
	public boolean insert(String sql) throws ClassNotFoundException, SQLException
	{
		getConnection();
		Statement statement = conn.createStatement();
		if(statement.executeUpdate(sql) != -1)
		{
			return false;
		}
		return true;
	}
	
	public ResultSet query(String sql) throws ClassNotFoundException, SQLException
	{
		getConnection();
		Statement statement = conn.createStatement();
		return statement.executeQuery(sql);
	}
	
	public void delete(String sql) throws ClassNotFoundException, SQLException
	{
		getConnection();
		Statement statement = conn.createStatement();
		statement.executeUpdate(sql);
	}
	
	public void update(String sql) throws ClassNotFoundException, SQLException
	{
		getConnection();
		Statement statement = conn.createStatement();
		statement.executeUpdate(sql);
	}
}
web.xml配置文件信息如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
	xmlns="http://java.sun.com/xml/ns/javaee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
  <servlet>
  		<servlet-name>myServlet</servlet-name>
  		<servlet-class>com.cancique.dao.LoginServlet</servlet-class>
  		<init-param>
  			<param-name>driver</param-name>
  			<param-value>com.mysql.jdbc.Driver</param-value>
  		</init-param>
  		<init-param>
  			<param-name>url</param-name>
  			<param-value>jdbc:mysql://localhost:3306/test_db</param-value>
  		</init-param>
  		<init-param>
  			<param-name>user</param-name>
  			<param-value>root</param-value>
  		</init-param>
  		<init-param>
  			<param-name>pass</param-name>
  			<param-value>900622</param-value>
  		</init-param>
  		<load-on-startup>1</load-on-startup>
  </servlet>
  
  <servlet-mapping>
  		<servlet-name>myServlet</servlet-name>
  		<url-pattern>/login</url-pattern>
  </servlet-mapping>
</web-app>




  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值