MVC实例应用模式
MVC实例应用模式
1.可用性:
比如异常处理

2.可修改性:
比如用接口实现

3.性能战术:
4.易用性战术:
分层实现
5.可测试性战术:
实现对其接口进行测试,并不需要对其实现方法进行

6.安全性战术:
对用户的密码进行MD5加密
MVC设计实现及其具体应用
实体类:
package com.keith.bean;
public class TUser implements java.io.Serializable {
private static final long serialVersionUID = 1L;
private Integer userid;
private String userName;
private String pwd;
public TUser() {
}
public Integer getUserid() {
return userid;
}
public void setUserid(Integer userid) {
this.userid = userid;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
}
需要一个数据库工具类,DBConn:
package com.keith.util;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class DBConn {
private static final String DBDRIVER = "com.mysql.jdbc.Driver";
private static final String DBURL = "jdbc:mysql://127.0.0.1:3306/login";
private static final String DBUSER = "root";
private static final String DBPWD = "kejianjun";
private Connection conn = null;
public DBConn() {
try {
Class.forName(DBDRIVER);
conn = DriverManager.getConnection(DBURL, DBUSER, DBPWD);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
public void close() throws Exception{
if (this.conn != null) {
try {
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
public Connection getConn() {
return conn;
}
public void setConn(Connection conn) {
this.conn = conn;
}
}
然后从页面开始index.jsp(客户端验证一下):
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
<script type="text/javascript">
function validate(f){
if (!(/^\w{4,15}$/.test(f.username.value))) {
alert("用户名必须是4~16位!");
f.username.focus();
return false;
}
if (!(/^\w{4,15}$/.test(f.pwd.value))) {
alert("密码必须是4~15位!");
f.pwd.focus();
return false;
}
return true;
}
</script>
</head>
<body>
<%
List<String> info = (List<String>)request.getAttribute("info");
if(info != null){
Iterator<String> iter = info.iterator();
while(iter.hasNext()){
%>
<h3><font color="red"><%=iter.next() %></font></h3>
<%}
} %>
<form action="login" method="post" onsubmit="return validate(this)" name="f">
用户名:<input type="text" name="username"><br />
密 码:<input type="password" name="pwd"><br />
<input type="submit" value="登陆">
<input type="reset" value="取消">
</form>
</body>
</html>
然后通过发出的login请求在web.xml里找到想对应的servlet:
<servlet>
<servlet-name>login</servlet-name>
<servlet-class>com.keith.servlet.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>login</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
<servlet>
找到了LoginServlet:
package com.keith.servlet;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.keith.bean.TUser;
import com.keith.factory.DAOFactory;
/**
* 定义Sevlet
*
* @author T
*
*/
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
this.doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String sucPath = "main.jsp";
String loginEroPath = "index.jsp";
String username = req.getParameter("username");
String pwd = req.getParameter("pwd");
List<String> info = new ArrayList<String>();
if (username == null || "".equals(username)) {
info.add("用户名不能为空!");
}
if (pwd == null || "".equals(pwd)) {
info.add("密码不能为空!");
}
//用户名密码通过验证
if (info.size() == 0) {
//实例化VO
TUser user = new TUser();
//设置username
user.setUserName(username);
//设置pwd
user.setPwd(pwd);
if (DAOFactory.getIUserDAOInstance().findLogin(user)) {
info.add("欢迎:" + user.getUserName());
//保存信息,进行跳转
req.setAttribute("info", info);
req.getRequestDispatcher(sucPath).forward(req, resp);
} else {
info.add("用户信息错误!");
req.setAttribute("info", info);
req.getRequestDispatcher(loginEroPath).forward(req, resp);
}
}
}
}
通过DAO工厂找到UserDAO的实例:这是DAOFactory:
package com.keith.factory;
import com.keith.dao.IUserDAO;
import com.keith.dao.proxy.UserDAOProxy;
/**
* 定义工厂类,取得DAO实例
* @author T
*
*/
public class DAOFactory {
/**
* 取得DAO实例
* @return
*/
public static IUserDAO getIUserDAOInstance(){
//返回代理实例
return new UserDAOProxy();
}
}
返回代理实例,找到userDAO的代理类:
package com.keith.dao.proxy;
import com.keith.bean.TUser;
import com.keith.dao.IUserDAO;
import com.keith.dao.UserDAOImpl;
import com.keith.util.DBConn;
/**
* DAO代理操作类
*
* @author T
*
*/
public class UserDAOProxy implements IUserDAO {
private DBConn dbc = null;
private IUserDAO dao = null;
public UserDAOProxy() {
//实例化数据库连接
this.dbc = new DBConn();
this.dao = new UserDAOImpl(this.dbc.getConn());
}
/**
* 代理登陆方法
*/
public boolean findLogin(TUser user) {
boolean flag = false;
try {
// 调用真实主题
flag = this.dao.findLogin(user);
this.dbc.close();
} catch (Exception e) {
e.printStackTrace();
}
return flag;
}
}
找到UserDAOImpl的并执行它的findLogin()方法:
package com.keith.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import com.keith.bean.TUser;
public class UserDAOImpl implements IUserDAO {
private Connection conn = null;
private PreparedStatement pstm = null;
public UserDAOImpl(Connection conn) {
this.conn = conn;
}
/**
* 登陆
*
* @throws SQLException
*/
public boolean findLogin(TUser user) {
boolean flag = false;
try {
String sql = "SELECT username,pwd FROM tuser WHERE username=? and pwd=?";
this.pstm = this.conn.prepareStatement(sql);
this.pstm.setString(1, user.getUserName());
this.pstm.setString(2, user.getPwd());
ResultSet rs = this.pstm.executeQuery();
if (rs.next()) {
user.setUserName(rs.getString(1));
flag = true;
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if (this.pstm != null) {
this.pstm.close();
}
} catch (SQLException e2) {
e2.printStackTrace();
}
}
return flag;
}
}
实现了IUserDAO接口:
package com.keith.dao;
import java.sql.SQLException;
import com.keith.bean.TUser;
/**
* userDao接口
*
* @author T
*
*/
public interface IUserDAO {
/**
* 用户登录验证
*
* @param user
* @return
*/
public boolean findLogin(TUser user);
}
MVC设计模式在具体网站中的应用
对于百度的首页来说

给用户呈现的就是V,每当用户输入不同的内容,数据层就会处理呈现出不同的页面
MVC实例应用模式的更多相关文章
- MVC(Model -View-Controller)实例应用模式
MVC(Model -View-Controller)实例应用模式 以登录为例: Model:User package com.keith.bean; public class TUser imple ...
- MVC5+EF6 入门完整教程十一:细说MVC中仓储模式的应用
摘要: 第一阶段1~10篇已经覆盖了MVC开发必要的基本知识. 第二阶段11-20篇将会侧重于专题的讲解,一篇文章解决一个实际问题. 根据园友的反馈, 本篇文章将会先对呼声最高的仓储模式进行讲解. 文 ...
- MVC5+EF6 入门完整教程11--细说MVC中仓储模式的应用
摘要: 第一阶段1~10篇已经覆盖了MVC开发必要的基本知识. 第二阶段11-20篇将会侧重于专题的讲解,一篇文章解决一个实际问题. 根据园友的反馈, 本篇文章将会先对呼声最高的仓储模式进行讲解. 文 ...
- 浅析前端开发中的 MVC/MVP/MVVM 模式
MVC,MVP和MVVM都是常见的软件架构设计模式(Architectural Pattern),它通过分离关注点来改进代码的组织方式.不同于设计模式(Design Pattern),只是为了解决一类 ...
- 细说MVC中仓储模式的应用
文章提纲 概述要点 理论基础 详细步骤 总结 概述要点 设计模式的产生,就是在对开发过程进行不断的抽象. 我们先看一下之前访问数据的典型过程. 在Controller中定义一个Context, 例如: ...
- Django---定义、MVC和MTV模式、命令行工具、配置文件settings
1.什么是web框架 框架,即framework,特指为解决一个开放性问题而设计的具有一定约束性的支撑结构,使用框架可以帮你快速开发特定的系统,简单地说,就是你用别人搭建好的舞台来做表演. 对于所有的 ...
- MVC视图展现模式之移动布局解析-续集
网站就必须用响应式布局吗?MVC视图展现模式之移动布局:http://www.cnblogs.com/dunitian/p/5213787.html demo:http://pan.baidu.com ...
- [WCF编程]7.实例上下文模式
一.实例上下文模式概述 实例上下文(IntanceContext Mode)表示服务端的服务实例与客户端的服务代理的绑定方式. 在实例化服务器对象时,WCF采用了3种不同的模式:单调(Per-Call ...
- WCF实例上下文模式与并发模式对性能的影响
实例上下文模式 InstanceContextMode 控制在响应客户端调用时,如何分配服务实例.InstanceContextMode 可以设置为以下值: •Single – 为所有客户端调用分配一 ...
随机推荐
- 禁用windows10自动更新
更换win10系统后经常会自动更新,每次关机前都会提示关机并更新选项,禁用window update后每隔几天还是会出现 解决:同时禁用以下两项 Windows Update Medic Servic ...
- golang 实现HTTP代理和反向代理
正向代理 package main import ( "fmt" "io" "net" "net/http" " ...
- Install Docker Compose
https://docs.docker.com/compose/install/ sudo curl -L "https://github.com/docker/compose/releas ...
- 教程一 openwrt路由器入门 远程命令行+文件系统
如图,拿到一个openwrt路由器我们第一步要远程控制. 这里在买了两块wifi-robots wifi视频模块. 0首先说下这个WIIF的信息 淘宝购买链接 https://item.taobao ...
- 毕业设计5:基于MicroPython的智能火灾报警器系统的设计与实现
随着现代家庭用火.用电量的增加,家庭火灾发生的频率越来越高.家里一旦发生火灾,如果出现扑救不及时.灭火器材缺乏.以及在场人惊慌失措.逃生迟缓等不利情况下,最终就会导致产生重大的生命财产的损失. 消防部 ...
- 在比特币的OP_RETURN上,大家都干了些啥?
我在之前的一篇文章中介绍了怎么通过C#将一句话写入到比特币的区块链网络中,最近花了好几天的时间,我终于把比特币的区块链数据载入到了SQLServer(具体做法参加我的这篇博客:http://www.c ...
- 在Bootstrap开发框架中使用Grid++报表
之前在随笔<在Winform开发中使用Grid++报表>介绍了在Winform环境中使用Grid++报表控件,本篇随笔介绍在Bootstrap开发框架中使用Grid++报表,也就是Web环 ...
- Python 原生协程------asyncio
协程 在python3.5以前,写成的实现都是通过生成器的yield from原理实现的, 这样实现的缺点是代码看起来会很乱,于是3.5版本之后python实现了原生的协程,并且引入了async和aw ...
- Django(八)上:Model操作和Form操作
↑↑↑点上面的”+”号展开目录 Model和Form以及ModelForm简介 Model操作: 创建数据库表结构 操作数据库表 做一部分的验证 Form操作: 数据验证(强大) ModelForm ...
- JQ高级
一.选择器 css语法选择器 $('css3 选择器位‘) 索引匹配 $('div:eq(0)') $('div').eq(0) 内容 $('div:contains(标签文本内容)') // 注:采 ...