`
xichao1929
  • 浏览: 40213 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

谈mvc

 
阅读更多

 

   首先稍微解释一下MVC的含义,M(model),是指数据模型,这就和数据库有关了。V(view),是指视图,通俗讲应该就是网页界面,C(control)就是实现MV之间的消息的沟通。

网站重要的两个部分就是数据库和界面,我们又通常称之为前台和后台,显然这两个有着密切的关系,但最好把这两个分离开来,或者说,把它们之间的千丝万缕的,隐隐约约的关系,搞的更清晰一些。有一个角色用来单独处理他们之间的关系比较好。这个就是C(control)。于是MVC结构应运而生了。

   下面详细谈一下,自己实现的MVCMVC的结构就是下面的这个图。

 

 

  下面解释一下我写的代码:

   首先是,浏览器发出请求,login,根据web.xml文件配置,请求到达ControlServlet

ControlServlet解析请求路径,得到请求是login,然后根据mvc.pro(自己定义)的文件配置,

利用反射原理实例化相应的请求Action(本身是一个接口)类的对象,调用相应的方法,再

ActionForward(专门负责跳转页面的类)里,跳转页面。

下面是代码:

  三个包:web  webAction  webServlet

package web;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

/**
 * 连接数据库的代码
 * 
 * @author txc
 * 
 */
public class DBlink {
	/**
	 * 判断是是否登入成功的方法
	 * 
	 * @param userName
	 * @param usePwd
	 * @return
	 * @throws SQLException
	 */
	public boolean userLogin(String userName, String usePwd)
			throws SQLException {

		// 这个是连接到数据库的方法
		String sql = "select userPwd  from userinfo  where userName = '"
				+ userName + "';";
		ResultSet rs = linkDB().executeQuery(sql);
		while (rs.next()) {
			String pwd = rs.getString(1);
			if (pwd.equals(usePwd)) {// 密码正确
				return true;
			}
		}
		return false;
	}

	/**
	 * 判断是否注册成功的方法
	 * 
	 * @param userName
	 * @param userPwd
	 * @return
	 * @throws SQLException
	 */
	public boolean userResgister(String userName, String userPwd)
			throws SQLException {
		// return true ;
		int len = userName.length();
		if (len > 20) {
			return false;
		}

		String sql = "select userName from userinfo  where userName = '"
				+ userName + "';";
		ResultSet rs = linkDB().executeQuery(sql);
		if (rs.next()) {// 如果存在的话,肯定不行的
			// System.out.println("数据库查询了吗?");
			// String name = rs.getString(1);
			// System.out.println("数据库查询了吗?"+name);
			return false;
		} else {// 这个用户名没有被注册
			sql = "insert into  userinfo(userName ,userPwd)values ('"
					+ userName + "','" + userPwd + "');";
			linkDB().executeUpdate(sql);

			return true;
		}
	}

	/*
	 * 查询的方法
	 */
	public ResultSet inquire() throws SQLException {
		String sql = "select * from userinfo ";
		ResultSet rs = linkDB().executeQuery(sql);
		return rs;
	}

	public void operation(int num) throws SQLException {
		String sql = " delete from userinfo where id=" + num + ";";
		linkDB().executeUpdate(sql);
	}

	/**
	 * 
	 * @param sql
	 *            sql代码
	 * @return 放回结果集对象
	 */
	private Statement linkDB() {
		try {
			// 装载对应数据库的驱动类
			Class.forName("com.mysql.jdbc.Driver").newInstance();
			// 数据库连接串
			String dbURL = "jdbc:mysql://localhost:3306/wmszinfo";
			// connection 代表程序与数据库的一个连接
			Connection con = DriverManager.getConnection(dbURL, "root", "1929");
			Statement state = con.createStatement(); // 用于执行sql语句的声明对象,执行后可以方法resultre对象

			return state;

		} catch (Exception g) {
			g.printStackTrace();
		}
		return null;
	}

}
webAction包

package webAction;

import java.sql.SQLException;

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

import webServlet.ActionForward;

public interface Action {

	
	public ActionForward execute(HttpServletRequest request, HttpServletResponse response) ;
	
}

这是loginAction类
package webAction;

import java.sql.SQLException;

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

import web.DBlink;
import webServlet.ActionForward;

public class LoginAction implements Action {

	@Override
	public ActionForward execute(HttpServletRequest request,
			HttpServletResponse response)  {
		ActionForward af = null;
		DBlink db = new DBlink();
		String userName = request.getParameter("userName");
		String userpwd = request.getParameter("userPwd");
        try {
			if(db.userLogin(userName, userpwd)){
				//如果登入成功
				request.getSession().setAttribute("current",userName);
			} 
			af = new ActionForward("index.jsp");//最终总是转到index页面
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return af;
	}

}

这是ControlSevlet类
package webServlet;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Properties;
import java.util.StringTokenizer;

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

import webAction.Action;

/**
 * Servlet implementation class ControlServlet
 */
public class ControlServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	Properties pro = new Properties();

	/**
	 * @see HttpServlet#HttpServlet()
	 */
	public ControlServlet() {
		super();
		// TODO Auto-generated constructor stub
	}

	public void service(HttpServletRequest request, HttpServletResponse response)
			throws IOException, ServletException {
           
		String uri = request.getRequestURI();// 得到请求的路径
		File file = new File(uri);
		String filename = file.getName();// 只是为了得到login.Action
		// 再去掉.Action
		StringTokenizer st = new StringTokenizer(filename, ".");
		String requestString = "";
		if (st.hasMoreElements()) {
			requestString = st.nextToken();// 现在是真正得到了login
		}
		//System.out.println();
		// 根据 login得到相应的类
		String classname = pro.get(requestString).toString();
		try {
			Action action = (Action) Class.forName(classname).newInstance();// 根据相应的请求创建相应的对象
			// 调用相应的方法
			ActionForward af = action.execute(request, response);// 若是登入则登入
			// 跳转页面
			af.forward(request, response);
		} catch (InstantiationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

	@Override 
	public void init(){
		String path = "/WEB-INF/mvc.pro";

		// 我们仔细看一下这些路径是什么意思
		 
		try {
			pro.load(new FileReader(new File(this.getServletContext().getRealPath(
					path))));
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}
这是页面跳转的类
package webServlet;

import java.io.IOException;

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

/**
 * 跳转页面的类
 * @author txc
 *
 */
public class ActionForward {
	String path = "";
//	这是构造方法 
	public ActionForward(String path){
		this.path = path;
	}

	public void forward(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
		//跳转页面
		request.getRequestDispatcher(path).forward(request, response);
	}
}

 

mvc.pro是一个自定义配置文件

里面的内容,类似于键值对

如:

login=webAction.LoginAction
register=webAction.RegisterAction
exit=webAction.ExitAction

 

另外它和web.xml放在相同的目录下面。这个文件的加载方法,在ControlServelt里面,即init方法。

 

<!--EndFragment--><!--EndFragment-->
分享到:
评论

相关推荐

    浅谈MVC架构在DotNET WinForm中的应用(C#)

    同时,文档 `浅谈MVC架构在DotNET WinForm中的应用(C#).doc` 应该提供了理论背景和详细的步骤指导,帮助我们理解和实践 MVC 设计模式。 总之,MVC 架构为 DotNET WinForm 应用提供了强大的设计思路,使得开发者可以...

    浅谈MVC设计模式与MFC文档结构

    **MVC设计模式详解** MVC(Model-View-Controller)设计模式是一种广泛应用于软件工程,尤其是Web开发中的架构模式。它将应用程序分为三个主要组件:模型(Model)、视图(View)和控制器(Controller)。这种分离...

    PHP发明人谈MVC和网站设计架构 貌似他不支持php用mvc

    【PHP发明人谈MVC和网站设计架构】的讨论中,Rasmus Lerdorf,作为PHP的创始人,分享了他对构建具有高扩展性、安全性和性能的网站架构的观点。他指出,PHP是世界上最广泛使用的网页开发语言,尤其在台湾地区应用广泛...

    浅谈MVC框架的优点(翻译)

    【浅谈MVC框架的优点(翻译)】 MVC(Model-View-Controller)框架是一种广泛应用于Web开发的设计模式,旨在提高代码的可读性、可维护性和可测试性。本文将探讨MVC框架相对于传统ASP.NET Web Forms的一些优势。 **...

    浅谈MVC设计模式(示例)

    **什么是MVC设计模式** MVC(Model-View-Controller)设计模式是一种软件架构模式,它将应用程序分为三个主要组件,以实现职责分离,提高可维护性和可扩展性。MVC模式广泛应用于Web开发,特别是在Java领域,如使用...

    浅谈框架与MVC

    ### 浅谈框架与MVC #### 架构的重要性及概念 在软件开发领域,架构设计扮演着至关重要的角色。良好的架构设计不仅能够确保软件系统的稳定性、可维护性和可扩展性,还能提升团队协作效率。正如文章所述,“好的产品...

    浅谈MVC+EF easyui dataGrid 动态加载分页表格

    首先上javascript的代码 [removed] $(function () { LoadGrid(); }) //加载表格!!! function LoadGrid() { $('#roleGrid').datagrid({ width: 900, striped: true, //交替条纹 ... idF

    浅谈模型-视图-控制器(MVC)模式

    ### 浅谈模型-视图-控制器(MVC)模式 #### 一、MVC模式简介 MVC(Model-View-Controller),即模型-视图-控制器模式,是一种广泛应用于软件开发领域的设计模式,特别是在桌面应用和Web应用程序中。这种模式的...

    浅谈三大模式(mvc,mvp,mvvm)

    本文将深入探讨三种常见的设计模式:Model-View-Controller(MVC)、Model-View-Presenter(MVP)和Model-View-ViewModel(MVVM)。这些模式在构建用户界面时起着至关重要的作用,尤其是在Web和移动应用开发中。 ...

    Android学习之浅谈对MVC模式和MVP模式的理解

    本文将深入探讨两种常见的设计模式——MVC(Model-View-Controller)和MVP(Model-View-Presenter),并结合实际的TestMVP项目,解析它们在实际开发中的运用。 首先,我们来了解一下MVC模式。MVC是一种软件设计模式...

    asp.net mvc 弹出窗口 技巧

    ASP.NET MVC是一个强大的框架,用于构建可维护的、高性能的Web应用程序。在ASP.NET MVC中实现弹出窗口功能,能够增强用户体验,例如用于确认操作、显示详细信息或进行表单输入。以下是一些关于在ASP.NET MVC中实现弹...

    php自己编写mvc框架

    当我们谈到“php自己编写mvc框架”时,意味着我们要实现一个基于PHP的自定义MVC架构。 ** MVC模式详解 ** 1. **Model(模型)**:模型是应用程序的核心部分,负责管理和操作数据。在PHP MVC框架中,模型类通常与...

    【ASP.NET编程知识】浅谈ASP.NET MVC应用程序的安全性.docx

    【ASP.NET MVC应用程序的安全性】 ASP.NET MVC是一个用于构建Web应用程序的开源框架,它强调模型-视图-控制器(MVC)设计模式。虽然ASP.NET MVC提供了强大的开发灵活性,但同时也意味着开发人员需要更加关注应用...

    【ASP.NET编程知识】浅谈ASP.NET MVC 防止跨站请求伪造(CSRF)攻击的实现方法.docx

    浅谈 ASP.NET MVC 防止跨站请求伪造(CSRF)攻击的实现方法 本文档对 ASP.NET MVC 中防止跨站请求伪造(CSRF)攻击的实现方法进行了详细的探讨。首先,文章介绍了 CSRF 攻击的定义和历史,然后通过一个模拟的示例,...

    MVC.rar_mvc_mvc CSharp_restaurant_三层 CSHARP_餐馆

    浅谈“三层结构”原理与用意.doc文档可能会详细讨论三层架构的设计原则和优点,比如提高了代码的可重用性、可测试性和可维护性。通过将不同职责的代码分开,开发者可以专注于各自领域的任务,提高开发效率。 ...

    Java Spring MVC 简单的例子

    **Spring MVC 框架详解** Spring MVC 是 Java Web 开发中的一个核心框架,它作为 Spring 框架的一部分,提供了构建 MVC(Model-View-Controller)架构的应用程序的工具和结构。本教程将通过一个简单的例子来介绍...

    浅谈Asp.net Mvc之Action如何传多个参数的方法

    *** MVC框架是微软推出的一种用于构建Web应用程序的模型-视图-控制器(Model-View-Controller)框架,它允许开发者以一种更加灵活的方式来组织和管理Web应用程序的代码。在*** MVC中,Action方法是控制器中处理请求并...

Global site tag (gtag.js) - Google Analytics