MVC笔记(续集)
mvc设计模式之己见(二)
接着上一篇的mvc讨论,这里为大家介绍一下Model II 体系结构
应用程序都由三个部分组成:界面显示部分,用户响应部分,数据处理部分 引导,再看Model I的程序是否是这样?
发现一个相同问题:在Model I中请求控制和页面显示放在了一起。
Model I 缺陷解决办法:请求控制和页面显示分开。用Servlet来进行请求控制,JSP来页面显示。这就是Model II。
Model II中采用了MVC模式,是一种设计模式。
设计模式:设计模式为软件设计问题提供标准的解决方案,能为同一类问题提供解决的比较优化的方法。
MVC 将交互式应用程序组织成三个独立的模块:
应用程序模块,用于表示数据和业务逻辑。
数据表示,表示用户输入或请求结果。
控制器,用于发送请求和控制应用程序的流程。
生活事例:理解MVC 用消防救火来理解。发现火灾现象,打119报警消防中心,消防中心派某个消防队来灭火。这里面 火灾现象就是视图,消防中心就是控制器,消防队就相当于数据处理模块。 |
优点:使用同一模型处理多个请求,增加新客户端更容易,可以很灵活地设计和实现模型对象。
模型对象 表示 Web 应用程序的数据元素,用户可与这些数据元素进行交互。在J2EE中是JavaBean。(这里又分成PO、DTO、VO)
视图对象 提供模型组件以开发用户界面。在J2EE中是JSP。(包括js、css、html)
控制器对象 充当应用程序视图对象和模型对象之间的中间对象。在J2EE中是Servlet。
1 package example_sg_1;
2
3 import javax.servlet.*;
4 import javax.servlet.http.*;
5 import java.io.*;
6 import java.util.*;
7
8 public class ProductQuery
9 extends HttpServlet {
10
11 //Initialize global variables
12 public void init() throws ServletException {
13 }
14
15 //Process the HTTP Get request
16 public void doGet(HttpServletRequest request, HttpServletResponse response) throws
17 ServletException, IOException {
18 String p_productID = request.getParameter("txtproductid");
19 String sql = "select * from productdetails where ProductId='"+p_productID+"'";
20 System.out.println(sql);
21 ColProduct product = new ColProduct();
22 Collection col = product.getProduct(sql);
23 request.setAttribute("result",col);
24 RequestDispatcher dis = request.getRequestDispatcher("jsp2.jsp");
25 dis.forward(request,response);
26 }
27
28 //Process the HTTP Post request
29 public void doPost(HttpServletRequest request, HttpServletResponse response) throws
30 ServletException, IOException {
31 doGet(request, response);
32 }
33
34 //Clean up resources
35 public void destroy() {
36 }
37 }
1 <%@ page contentType="text/html; charset=GBK" %>
2 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
3 <html>
4 <head>
5 <title>
6 jsp2
7 </title>
8 </head>
9 <body bgcolor="#ffffff">
10 <c:forEach var="pro" items="${requestScope.result}">
11 <b>产品名称:
12 ${pro.productname}</b>
13 <br/>
14 <b>产品类型:
15 ${pro.producttype}</b>
16 <br/>
17 <b>产品价格:
18 ${pro.productprice}
19 </b>
20 <br/>
21 <b>品牌:
22 ${pro.brand}
23 </b>
24 <br/>
25 <b>说明:
26 ${pro.description}
27 </c:forEach>
28 </body>
29 </html>
1 <%@page contentType="text/html; charset=GBK"%>
2 <html>
3 <head>
4 <title>newtopic</title>
5 </head>
6 <form name="form1" action="newtopicservlet" method="POST">
7 <table align="center" bgcolor="#008800" border="0" cellspacing="2" cellpadding="5" width=80%>
8 <tr bgcolor="#cccccc">
9 <td>标题</td>
10 <td>
11 <input type=text name="title">
12 </td>
13 </tr>
14 <tr bgcolor="#cccccc">
15 <td>作者</td>
16 <td>
17 <input type=text name="author">
18 </td>
19 </tr>
20 <tr bgcolor="#cccccc">
21 <td>电子邮件</td>
22 <td>
23 <input type=text name="email">
24 </td>
25 </tr>
26 <tr bgcolor="#ccffcc">
27 <td>内容</td>
28 <td>
29 <textarea cols=40 rows=9 name="content"> </textarea>
30 </td>
31 </tr>
32 <tr bgcolor="#cccccc">
33 <td> </td>
34 <td>
35 <input type=submit value=提交>
36 </td>
37 </tr>
38 </table>
39 </form>
40 </body></html>
示例:请求控制器,newtopicservlet.java(完整代码)
1 package example_sg_2;
2
3 import javax.servlet.*;
4 import javax.servlet.http.*;
5 import java.io.*;
6 import java.util.*;
7 import java.sql.*;
8
9 public class newtopicservlet
10 extends HttpServlet {
11 public newtopicservlet() {
12 try {
13 jbInit();
14 }
15 catch (Exception ex) {
16 ex.printStackTrace();
17 }
18 }
19
20 private static final String CONTENT_TYPE = "text/html; charset=GBK";
21
22 //Initialize global variables
23 public void init() throws ServletException {
24 }
25
26 //Process the HTTP Get request
27 public void doGet(HttpServletRequest request, HttpServletResponse response) throws
28 ServletException, IOException {
29 response.setContentType(CONTENT_TYPE);
30 try {
31 /**
32 *获得请求中的参数
33 */
34 request.setCharacterEncoding("GBK");
35 String title = request.getParameter("title");
36 String author = request.getParameter("author");
37 String email = request.getParameter("email");
38 String content = request.getParameter("content");
39 DataBaseConn dbBean = DataBaseConn.newInstance();
40 Connection con = dbBean.getConnDB();
41 Statement stmt = con.createStatement();
42
43 /**
44 *执行数据库更新操作,把回复的信息保存到数据库中
45 */
46 stmt.executeUpdate("insert into topic values('" +
47 new java.util.Date().getTime() + "','" + title + "','" +
48 author + "','" + email + "','" + content +
49 "',getdate())");
50 stmt.close();
51 con.close();
52 }
53 catch (Exception e) {
54 e.printStackTrace();
55 }
56
57 /**
58 *把视图派发到viewForum.jsp
59 */
60
61 javax.servlet.RequestDispatcher dis = request.getRequestDispatcher( "viewforum.jsp");
62 dis.forward(request, response);
63 }
64
65 //Process the HTTP Post request
66 public void doPost(HttpServletRequest request, HttpServletResponse response) throws
67 ServletException, IOException {
68 doGet(request, response);
69 }
70
71 //Clean up resources
72 public void destroy() {
73 }
74
75 private void jbInit() throws Exception {
76 }
77 }
示例:视图,view.jsp
1 <%@ page contentType="text/html; charset=GB18030" %>
2 <html>
3 <head>
4 <title>
5 viewforum
6 </title>
7 </head>
8 <body bgcolor="#ffffff">
9 <h1>
10 ok
11 </h1>
12 </body>
13 </html>
示例:数据库连接, DataBaseConn.java
1 package example_sg_2;
2
3 import java.sql.*;
4
5 public class DataBaseConn {
6 Connection con = null;
7 private static DataBaseConn me = new DataBaseConn();
8
9
10 public static DataBaseConn newInstance() {
11 return me;
12 }
13
14 public Connection getConnDB() {
15 try {
16 Class.forName("sun.jdbc.odbc.JdbcOdbcDriver").newInstance();
17 con = DriverManager.getConnection("jdbc:odbc:accp", "", "");
18 }
19 catch (Exception e) {
20 e.printStackTrace();
21 }
22 return con;
23 }
24 public DataBaseConn() {
25 }
26 }
总结:
Model I 优点:编写简单,开发周期短,适用于小的web应用程序。缺点:层次结构不够清晰,对用户请求控制不方便,维护修改困难等。
Model II 优点:层次结构清晰,对用户请求控制很方便,安全性高,维护修改容易等,适用于大中型的web应用程序。缺点:开发周期相对较长等。
MVC包含哪些组件,在JSP/Servlet里如何体现?
答:模型,用JavaBean表示;视图,用JSP表示;控制器,用Servlet表示。