MVC架构模式
MVC架构模式包括Model模型-View视图-Controller控制器三层。
Model模型包括业务模型dao类和数据模型pojo类。数据模型pojo类与数据库中的表相对应。数据库中是一条信息作为一个存储,而一个pojo对象则对应数据库中的一条信息。业务模型dao类主要调用pojo数据类型执行业务。
View视图指的是用HTML语言和JSP界面设计人员进行图形界面设计。JSP其实相当于Servlet的功能,可以将java等编程语言集结到界面中,用<%%>即可。
Controller控制器是一个主控Servlet。主控servlet在web容器中配置为*.do,即任何由浏览器的客户端发出的请求都用主控servlet来接受和作出对应的响应。主控servlet运作:得到用户的请求路径,与web容器中的运行时参数,根据参数得到全类名,调用actionfactory创建对应的action类,返回相应动作的url,将页面跳转到相应的url。主控servlet的作用:首先控制器接收用户的请求,并决定应该调用哪个模型来进行处理,然后模型用业务逻辑来处理用户的请求并返回数据,最后控制器用相应的视图格式化模型返回的数据,并通过表示层呈现给用户。
采用MVC架构模式的优势:
1、层次分明,逻辑清楚,即三层架构。
2、封装。视图层和业务层分离,只需更改视图层代码而不用重新编译模型和控制器代码。
3、重用性高。可以共享数据模型,所有代码的重用性高。
4、可维护性。利于维护和修改。
建立一个用户数据模型
package cn.netjava.pojo; /** * 用户类 * @author Administrator * */ public class Userinfo(){ private int id;//用户ID private String name;//用户名 private String pwd;//用户密码 public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPwd() { return pwd; } public void setPwd(String pwd) { this.pwd = pwd; } }
创建一个用户业务模型
package cn.netjava.dao; import java.sql.SQLException; import cn.netjava.conn.ConnectionSQL; import cn.netjava.pojo.Userinfo; /** * 用户Dao类 * 主要功能:修改用户信息,判断是否存在用户 * @author Administrator * */ public class UserDao { private ConnectionSQL conSQL=new ConnectionSQL(); java.sql.Connection conn=conSQL.getConn(); //修改用户信息 private boolean modify(Userinfo user){ ConnectionSQL connSQL=new ConnectionSQL(); java.sql.Connection conn=connSQL.getConn(); try { //使用预编译sql语句 //?为占位符 String sql="insert into userinfo set name=?,pwd=?,email=?,sex=?,qq=?,photo=?"; //创建预编译对象 java.sql.PreparedStatement prst=conn.prepareStatement(sql); prst.setString(1, user.getName()); prst.setString(2,user.getPwd()); prst.setString(3,user.getEmail()); prst.setString(4,user.getSex()); prst.setString(5,user.getQq()); prst.setString(6, user.getPhoto()); int count=prst.executeUpdate(); if(count>0){ return true; } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); return false; } return false; } //判断是否存在用户 public Userinfo getExist(String name,String pwd){ Userinfo user=new Userinfo(); try{ String sql="select * from Userinfo where name=? and pwd=?"; //使用预编译 java.sql.PreparedStatement prst=conn.prepareStatement(sql); prst.setString(1, name); prst.setString(2, pwd); java.sql.ResultSet rset=prst.executeQuery(); while(rset.next()){ user.setId(rset.getInt(1)); user.setName(rset.getString(2)); user.setPwd(rset.getString(3)); user.setEmail(rset.getString(4)); user.setSex(rset.getString(5)); user.setQq(rset.getString(6)); user.setPhoto(rset.getString(7)); } }catch(Exception e){ e.printStackTrace(); } return user; } }
创建主控servlet
package cn.netjava.servlet; /** * 主控制器 * @author Administrator * */ import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import cn.netjava.action.Action; import cn.netjava.action.ActionFactory; public class ServletControl extends javax.servlet.http.HttpServlet{ @Override protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //得到servlet请求的路径 String path=request.getServletPath(); System.out.println("servlet请求的路径:"+path); //得到请求的动作名 String actionName=path.substring(1,path.lastIndexOf(".do")); System.out.println("得到请求的动作名:"+actionName); //得到主控servlet的运行的参数 String className=this.getInitParameter(actionName); System.out.println("action实现子类的全名:"+className); //根据ActionFactory类得到Action实现子类的对象 Action action=ActionFactory.getActionFactory().getAction(className); //调用action实现类 String url=action.service(request, response); //跳转到指定界面 request.getRequestDispatcher(url).forward(request, response); } }
创建Action接口
package cn.netjava.action; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * 定义一个动作接口 * * @author Administrator * */ public interface Action { /** * * @param request:请求对象 * @param response:相应对象 * @return:返回传送回浏览器的URL * @throws ServletException * @throws IOException */ String service(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException; }
创建一个ActionFactory对象
package cn.netjava.action; /** * 生成一个Action对象的工厂类 * @author Administrator * */ public class ActionFactory { //定义私有的构造器 private ActionFactory(){ } //定义ActionFactory对象 private static ActionFactory af=null; /** *得到ActionFactory对象的方法 * @return:ActionFactory对象 */ public static ActionFactory getActionFactory(){ if(af==null){ af=new ActionFactory(); } return af; } /** * 用来创建action对象的方法 * @param className:action实现类的全名 * @return:action 对象 */ public Action getAction(String className){ Action action=null; try{ //得到action实现类 action=(Action)Class.forName(className).newInstance(); }catch(Exception e){ System.out.println("构建action对象出错!"); e.printStackTrace(); } return action; } }
继承Action接口实现LoginAction
package cn.netjava.action; /** * 登陆动作类实现Action接口 * @author Administrator * */ import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import cn.netjava.dao.UserDao; import cn.netjava.pojo.Userinfo; public class LoginAction implements Action{ /** * 验证用户的登陆 */ public String service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //得到用户登陆的信息 String name=request.getParameter("name"); String pwd=request.getParameter("pwd"); //创建用户对象 Userinfo user=new Userinfo(); //将用户输入的参数填充到用户对象中 user.setName(name); user.setPwd(pwd); //创建UserDao操作类的对象 UserDao udao=new UserDao(); //调用判断用户是否存在数据库的方法 user=udao.getExist(name, pwd); if(!user.equals(null)){//如果用户id大于0即用户存在 request.getSession().setAttribute("user", user); return "OK.jsp"; }else{ return "wrong.jsp"; } } }
程序运作流程:
用户通过http协议进行访问登录界面,首先与web容器中的servlet进行匹配,当url正确时,执行登录业务。通过主控Servlet接受用户发来的登录信息——用户名和密码,通过web运行时参数得到类全名,根据类全名产生登录的action动作,调用用户登录业务,当用户名和密码正确时,返回登录正确的jsp,当用户名和密码不正确时,返回登录错误的jsp。