您的位置:首页 > 运维架构 > 网站架构

MVC架构模式

2014-02-25 14:45 316 查看
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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  架构 mvc