Servlet的生命周期和MVC设计模式

昨天上课的时候龙哥主要讲了使用MVC模式和oracle的数据分页,昨天上课被oracle的数据分页搞得稀里糊涂的,所以今天重新自己再重新的过一遍,本来是准备今天搞ajax的,没办法咯

MVC设计模式,m模型   v 数据显示  c 数据的逻辑处理  ,所有的设计模式都只是一个固定的写法


Servlet的生命周期和MVC设计模式
 
1,Servlet的生命周期和工作原理   (来自网络资源):

Servlet生命周期分为三个阶段:

1,初始化阶段  调用init()方法

2,响应客户请求阶段  调用service()方法

3,终止阶段  调用destroy()方法

Servlet初始化阶段:

在下列时刻Servlet容器装载Servlet:

1,Servlet容器启动时自动装载某些Servlet,实现它只需要在web.XML文件中的<Servlet></Servlet>之间添加如下代码:

<loadon-startup>1</loadon-startup>

2,在Servlet容器启动后,客户首次向Servlet发送请求

3,Servlet类文件被更新后,重新装载Servlet

Servlet被装载后,Servlet容器创建一个Servlet实例并且调用Servlet的init()方法进行初始化。在Servlet的整个生命周期内,init()方法只被调用一次。

Servlet工作原理:

首先简单解释一下Servlet接收和响应客户请求的过程,首先客户发送一个请求,Servlet是调用service()方法对请求进行响应的,通过源代码可见,service()方法中对请求的方式进行了匹配,选择调用doGet,doPost等这些方法,然后再进入对应的方法中调用逻辑层的方法,实现对客户的响应。在Servlet接口和GenericServlet中是没有doGet,doPost等等这些方法的,HttpServlet中定义了这些方法,但是都是返回error信息,所以,我们每次定义一个Servlet的时候,都必须实现doGet或doPost等这些方法。

每一个自定义的Servlet都必须实现Servlet的接口,Servlet接口中定义了五个方法,其中比较重要的三个方法涉及到Servlet的生命周期,分别是上文提到的init(),service(),destroy()方法。GenericServlet是一个通用的,不特定于任何协议的Servlet,它实现了Servlet接口。而HttpServlet继承于GenericServlet,因此HttpServlet也实现了Servlet接口。所以我们定义Servlet的时候只需要继承HttpServlet即可。

2,MVC模式的实现; 实现数据显示,数据处理,模型三大模块的分离

   步骤:

1.定义一个主控Servlet--->[ControlServlet]

2.定义一个处理类的接口--->[ActionInterface]

3 数据库的处理来的javabean保存数据的定义 

4.定义一个登录处理类  --->[LoginAction]

5.在web.xml中配置Servlet,将处理类作为Servlet的初始化参数进行配置

代码如下;

  1,定义一个主控Servlet--->[controlServlet]

package servletMvc;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import configControlServlet.ActionInterface;

/**
 * 
 * @author Administrator 主控制器的Servlet 1.接受请求 2,将数据转发到对应的Servlet中处理 3.转发到试图层
 */
public class controlServlet extends HttpServlet {
	@Override
	protected void service(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		// 获得请求的路径
		String uri = request.getRequestURI();
		uri = uri.substring(uri.lastIndexOf("/") + 1, uri.lastIndexOf("."));
		System.out.println("请求的路径" + uri);

		// 将登陆请求转交给登陆的Servlet处理
		String className = this.getInitParameter(uri);
		System.out.println(className);
    
		//根据反射得到该类的Class对象
		try {
	  //根据获得的包,进行反射得到class对象
        Class c =  Class.forName(className);
        //根据class对象创建对象,返回的是LoginAction类实现的接口
        ActionInterface ac= (ActionInterface)c.newInstance();
        //通过对象调用ac的方法
         String str= ac.exectu(request, response);
        
         //判断LoginAction类中返回的结果是否null,不为null就会返回一个地址
        if(str!=null){
        	//跳转
        	request.getRequestDispatcher(str).forward(request, response);
        }
        
		} catch (Exception e) {
			e.printStackTrace();
			
			request.getRequestDispatcher("Error.jsp").forward(request, response);
		}
	}
}

2.定义一个处理类的接口--->[ActionInterface]

  

package configControlServlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/*
 *每个类都必须要实现这个接口 
 */
public interface ActionInterface {
 
	public String exectu(HttpServletRequest request,
	HttpServletResponse response) throws IOException, ServletException;
}

3 数据库的处理来的javabean保存数据的定义 

   3,1  数据库的连接单例模式

package Servlet.db;

import java.sql.Connection;
import java.sql.DriverManager;

/**
 * 
 * 
 * @author Administrator
 *数据库的连接类
 */
public class DBUtil {
	  
   public static Connection conn =null ;
   
	private  DBUtil(){
		
	}
    
   public static Connection getConn(){  
	   if(conn!=null){
		   return conn;
	}
	   try{
		   Class.forName("oracle.jdbc.driver.OracleDriver");
		   String url = "jdbc:oracle:thin:@127.0.0.1:1521:orcl";
		  conn= DriverManager.getConnection(url,"SCOTT", "tiger");
		   return conn;
	   }catch(Exception  e){
		   e.printStackTrace();
		   return null;
	   }
	   
   }

}

3,2 处理数据查询的类

package Servlet.db;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

import Servlet.bean.User;
//处理数据查询的类
public class UserDao {

	public User getCheck(String userName,String userPwd){
		//获得连接对象
		Connection conn=DBUtil.getConn();
		//定义sql语句
		String sql="select usermailandphone,userpwd from bookeuser where usermailandphone=? and userPwd=?";
		//预编译
		try{
		PreparedStatement pstm=conn.prepareStatement(sql);
		pstm.setString(1, userName);
		pstm.setString(2, userPwd);
		ResultSet rs=pstm.executeQuery();
		System.out.println(sql);
		if(rs.next()){
			//创建对象,使用javaBean来处理数据
			User user= new User();
			user.setUserName(rs.getString(1));
			user.setUserPwd(rs.getString(2));
			return user;
		}
		}catch(Exception e){
			e.printStackTrace();
		}	
		return null;
	}
}

  3,3保存账号和密码的类javaBean

   

package Servlet.bean;
/**
 * 
 * @author Administrator
 *保存账号和密码的类  javaBean
 */
public class User {

	private String userName;
	private String userPwd;

	public String getUserName() {
		return userName;
	}

	public void setUserName(String userName) {
		this.userName = userName;
	}

	public String getUserPwd() {
		return userPwd;
	}

	public void setUserPwd(String userPwd) {
		this.userPwd = userPwd;
	}

}

4.定义一个登录处理类  --->[LoginAction]

  

package configControlServlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import Servlet.bean.User;
import Servlet.db.UserDao;

/**
 * 
 * @author Administrator
 *
 */
public class LoginAction implements ActionInterface{
    UserDao dao = new UserDao();
	@Override
	public String exectu(HttpServletRequest request,
			HttpServletResponse response) throws IOException, ServletException {
		System.out.println("达到了登陆的Servlet");
		 //获取登陆的用户和密码
		String userName = request.getParameter("usernames");
		String userPwd=request.getParameter("userpwd");
		//连接数据库查询
		User user =dao.getCheck(userName, userPwd);
		if(user!=null){
			//保存绘画中
			HttpSession session=request.getSession();
			session.setAttribute("user", user);
			//返回登陆成功的页面
			return "LoginSuss.jsp";	
		}
		//返回到登陆失败的页面
		return "Error.jsp";	
	}
}

    

5.在web.xml中配置Servlet,将处理类作为Servlet的初始化参数进行配置

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>MVC</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  
  <servlet>
  <description>主控制的Servlet</description>
  <servlet-name>controlServlet</servlet-name>
  <servlet-class>servletMvc.controlServlet</servlet-class>
  
    <init-param>
       <description>处理登陆的登陆的servlet</description>
        <param-name>login</param-name>
       <param-value>configControlServlet.LoginAction</param-value>
    </init-param>

  </servlet>
  
  <servlet-mapping>
  <servlet-name>controlServlet</servlet-name>
  <url-pattern>*.ser</url-pattern>
 </servlet-mapping> 
</web-app>

6,jsp代码;简单的显示页面这里就不写了

上面MVC全部的代码分析


Servlet的生命周期和MVC设计模式
 

相关推荐