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。

相关推荐