Servlet的生命周期和MVC设计模式
昨天上课的时候龙哥主要讲了使用MVC模式和oracle的数据分页,昨天上课被oracle的数据分页搞得稀里糊涂的,所以今天重新自己再重新的过一遍,本来是准备今天搞ajax的,没办法咯
?
MVC设计模式,m模型 ? v 数据显示 ?c 数据的逻辑处理 ?,所有的设计模式都只是一个固定的写法
?
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全部的代码分析
?
?
?
?
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。