第1页
设计模式之MVC基于Web
主讲:Hesey
第2页
提纲
What and Why
优缺点
实例分析
举一反三
第3页
What is MVC?
MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)。
目的:动态的程序设计
简化后续修改和扩展
复用代码
专一化(模块、人员)
第4页
视图
界面设计人员进行图形界面设计
展示数据(不仅仅是显示)
无业务逻辑
第5页
控制器
负责转发请求,对请求进行处理
不同层面间的组织作用
控制应用程序的流程
处理事件并作出响应
第6页
模型
包含程序应有的功能(实现算法等)
Bean/Service/DAO etc.
封装数据与逻辑
直接访问数据(DB)
不依赖“视图”和“控制器”
刷新机制
第7页
原始时代(JSP or Servlet)
第8页
原始时代(JSP or Servlet)
Password.htm
<HTML>
<BODY>
<form action="PasswordGen.jsp" method="POST">
<H3>Welcome to the Password Generator</H3>
First Name: <input type="text" name="firstName"><br>
Last Name: <input type="text" name="lastName"><br>
<p>
<input type="submit" value="Generate Password">
</form>
</BODY>
</HTML>
第9页
原始时代(JSP or Servlet)
第10页
原始时代(JSP or Servlet)
PasswordGen.jsp
<html>
<body>
<%
String firstName = request.getParameter("firstName");
String lastName = request. getParameter("lastName");
String password;
if( (firstName.length()>=2) && (lastName.length()>=2))
password = lastName.substring(0,2)+firstName.substring(0,2);
else
password = "NoGo";
%>
<h1>
Password Generated!
</h1>
Your super secret password is <%= password %>.
<br><a href="Password.htm">To generate another password.</a>
</body>
</html>
第11页
原始时代(JSP or Servlet)
PasswordGen.jsp
<html>
<body>
<%
String firstName = request.getParameter("firstName");
String lastName = request. getParameter("lastName");
String password;
if( (firstName.length()>=2) && (lastName.length()>=2))
password = lastName.substring(0,2)+firstName.substring(0,2);
else
password = "NoGo";
%>
<h1>
Password Generated!
</h1>
Your super secret password is <%= password %>.
<br><a href="Password.htm">To generate another password.</a>
</body>
</html>
看着都费劲,别说修改了╮(╯_╰)╭
第12页
缺点
职责多元
HTML代码和Java代码混杂(好眼花⊙﹏⊙)
修改逻辑 or 修改呈现?
代码复用?(审核身份、日志记录)
团队开发困难
第13页
MVC
第14页
优点
解耦
职责单一
分工明确(模块、人员)
代码复用
测试方便
对比
职责多元
HTML代码和Java代码混杂(好眼花)
修改逻辑 or 修改呈现?
增加服务?
代码复用?(审核身份、日志记录)
团队开发困难
第15页
缺点
比较抽象
没有明确的定义,难以完全理解
需要精心计划与设计,花费可观
更多文件,更多代码,增加了复杂度
这么复杂,为什么还要用?
弥补:框架
第16页
Servlet and JSP
第17页
Servlet and JSP
Password.htm
<HTML>
<BODY>
<form action="/webapp/passwordservlet" method="POST">
<H3>Welcome to the Password Generator</H3>
First Name: <input type="text" name="firstName"><br>
Last Name: <input type="text" name="lastName"><br>
<p>
<input type="submit" value="Generate Password">
</form>
</BODY>
</HTML>
第18页
Servlet and JSP
passwordServlet.java
public void doPost(HttpServletRequest request, HttpServletResponse response) throws Exception {
GenBean gb = new GenBean();
gb.setFirstName(request.getParameter("firstName"));
gb.setLastName(request.getParameter("lastName"));
gb.generate();
request.setAttribute("gen", gb);
RequestDispatcher rd = getServletContext().getRequestDispatcher("/PasswordGen.jsp");
rd.forward(request, response);
}
第19页
Servlet and JSP
GenBean.java
public class GenBean {
private String firstName;
private String lastName;
private String password = "NoGo";
public String getFirstName(){ return firstName; }
public void setFirstName(String fn){ firstName = fn;}
public String getLastName(){ return lastName; }
public void setLastName(String ln){ lastName = ln; }
public String getPassword(){return password;}
public String generate() {
if( (firstName.length() >= 2) && (lastName.length() >= 2))
password = lastName.substring(0,2) + firstName.substring(0,2);
return password;
}
}
第20页
Servlet and JSP
PasswordGen.jsp
<html>
<body>
<jsp:useBean id = "gen" class = “genpackage.GenBean" scope="request"/>
<h1>
Password Generated!
</h1>
Your super secret password is <jsp:getProperty name="gen" property="password"/>
<br><a href="Password.htm">To generate another password.</a>
</body>
</html>
清晰了很多吧o(≧v≦)o~~
第21页
体现分发的Servlet控制器
verify.java
public void doPost(HttpServletRequest request, HttpServletResponse response) throws Exception {
String username = request.getParameter(“username"));
String password = request.getParameter(“password"));
boolean valid = new Security().verify(username, password);
RequestDispatcher rd = null;
if(valid) {
rd = getServletContext().getRequestDispatcher("/valid.jsp");
}
else {
rd = getServletContext().getRequestDispatcher("/invalid.jsp");
}
rd.forward(request, response);
}
第22页
现在呈现和逻辑被分开了,真好呀
Servlet 1
Servlet 2
Servlet 3
JSP 1
JSP 2
JSP 3
有没有改进的余地?
第23页
如果把Servlet组合起来?
JSP 1
JSP 2
JSP 3
Controller
关系是不是简单了许多?
Model 1
Model 2
Model 3
第24页
Struts 2
第25页
Struts 2
浏览器
Web容器
Controller
Struts 2
Dispatcher
DataBase
XML配置
第26页
web.xml
<filter> <filter-name>struts2</filter-name> <filter-class> org.apache.struts2.dispatcher.FilterDispatcher </filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
第27页
Struts.xml
<struts>
<package name=“default” extends=“struts-default”>
<action name=“hello” class=“HelloWorld”>
<result name=“SUCCESS”>
/HelloWorld.jsp
</result>
</action>
</package>
</struts>
第28页
HelloWorld.java(POJO)
public class HelloWorld {private String message;public String execute() Exception { message = “Hello,world\n”;
message += “The time is:\n”;
message += System.currentTimeMillis(); return “SUCCESS”;}public void setMessage(String message){this.message = message;}public String getMessage() {return message;}}
第29页
HelloWorld.jsp
<%@ taglib prefix="s" uri="/struts-tags" %><html><head><title>Hello World!</title></head><body><h2><s:property value="message" /></h2></body></html>
第30页
举一反三
思考模式思想,套用模式不如不用模式
解耦
单一职责原则(SRP)
测试
第31页
谢谢!