第十一章 Servlet MVC模式
内包含案例,基于jsp+servlet的:MVC模式计算器;MVC模式登陆
第十一章 Servlet MVC模式
模型-视图-控制器(model-view-controller),简称MVC。MVC是一种先进的设计模式,它的核心思想是有效地组合“视图”、“模型”和“控制器”。掌握MVC模式对于设计合理的Web应用框架有着十分重要的意义。
MVC是一种通过三个不同部分构造一个软件或组件的理想办法:
- l 模型(model)用于存储数据的对象
- l 视图(view)向控制器提交所需数据、显示模型中的数据
- l 控制器(controller)负责具体的业务逻辑操作,即控制器根据视图提出的要求对数据做出处理,将有关结果存储到模型中,并负责让模型和视图进行必要的交互,当模型中的数据变化时,让视图更新显示。
从面向对象的角度看,MVC结构可以使程序更具有对象化特性,也更容易维护和扩展。
在JSP技术中,“视图”、“模型”和“控制器”的具体实现如下:
l 模型 一个或多个Javabean对象,用于存储数据,Javabean主要提供简单的setXXX方法和getXXX方法,在这些方法中不涉及对数据的具体处理细节,以便增强模型的通用性。
l 视图 一个或多个JSP页面,其作用主要是向控制器提交必要的数据和为模型提供数据显示,JSP页面主要使用HTML标记和Javabean标记来显示数据。
l 控制器 一个或多个servlet对象,根据视图提交的要求进行数据处理操作,并将有关的结果存储到Javabean中,然后servlet使用重定向方式请求视图中的某个JSP页面更新显示,即让该JSP页面通过使用Javabean标记显示控制器存储在Javabean中的数据。
JSP开发web项目的两种模型(Model1/Model2)
Model1(JSP+JavaBeans模式):
- 使用JSP+JavaBeans将页面显示和业务逻辑处理分开
- JSP实现页面显示,响应请求并将结果返回给客户
- JavaBean对象保存数据和实现业务逻辑
优点:实现了页面显示与业务逻辑的分离
缺点:需要在JSP页面控制流程转向并且调用JavaBean代码;业务逻辑复杂时,JSP编写变得复杂
案例
Jsp+javaBeans模式简单计算器:
Calculator.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>calculator</title> <script type="text/javascript"> function checkForm(){ // 对需要校验字段 添加 id 属性 var first = document.getElementById("first").value; var second = document.getElementById("second").value; var operator = document.getElementById("operator").value; // 判断参数必须为数字 if(isNaN(first) || isNaN(second)){ // isNaN is not a number alert("输入参数 必须为数字!"); return false; } if(second==0 && operator == '/'){ alert("除数不能为0!"); return false; } } </script> </head> <body> <!-- 计算器页面 --> <!-- 计算结果 --> <jsp:useBean id="calculator" class="com.silvan.pojo.CalculatorDemo1" scope="page"></jsp:useBean> <!-- 当用户提交form 自动封装 数据 --> <jsp:setProperty property="*" name="calculator"/> <h3>计算结果是 :${calculator.firstNum } ${calculator.operator } ${calculator.secondNum } = ${calculator.result }</h3> <hr/> <!-- 计算form表单 --> <h3>简单的计算器</h3> <form action="/lesson11/calculator.jsp" method="post" onsubmit="checkForm();"> <table> <tr> <td>第一个参数</td> <td> <!-- 使用 setProperty * form输入项name 必须和 javabean类属性一致 --> <input type="text" name="firstNum" id="first"/> </td> </tr> <tr> <td>运算符</td> <td> <select name="operator" id="operator"> <option value="+">+</option> <option value="-">-</option> <option value="*">*</option> <option value="/">/</option> </select> </td> </tr> <tr> <td>第二个参数</td> <td> <input type="text" name="secondNum" id="second" /> </td> </tr> <tr> <td colspan="2"> <input type="submit" value="计算"/> </td> </tr> </table> </form> </body> </html> |
CalculatorDemo1.java
package com.silvan.pojo; /** * 計算類 * @author Administrator */ public class CalculatorDemo1 { private String firstNum = "0"; // 参数一 private String secondNum = "0"; // 参数二 private String operator = "+"; // 运算符 private double result; // 运算结果 public String getFirstNum() { return firstNum; } public void setFirstNum(String firstNum) { this.firstNum = firstNum; } public String getSecondNum() { return secondNum; } public void setSecondNum(String secondNum) { this.secondNum = secondNum; } public String getOperator() { return operator; } public void setOperator(String operator) { this.operator = operator; } public double getResult() { // 将运算逻辑写到这里 Double a = Double.parseDouble(firstNum); Double b = Double.parseDouble(secondNum); Double result = 0.0; if (operator.equals("+")) { result = a + b; } else if (operator.equals("-")) { result = a - b; } else if (operator.equals("*")) { result = a * b; } else if (operator.equals("/")) { result = a / b; } return result; } public void setResult(double result) { this.result = result; } } |
模型2(MVC模式也就是JSP+JavaBeans+servlet模式)
- 将模型1中JSP嵌入的流程控制和部分逻辑处理代码提取至一个单独的角色:控制器
- 模型2是MVC架构模式在WEB开发中的应用
案例1
JSP中的MVC模式计算器
视图层Calculator.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>calculator</title> <script type="text/javascript"> function checkForm(){ // 对需要校验字段 添加 id 属性 var first = document.getElementById("first").value; var second = document.getElementById("second").value; var operator = document.getElementById("operator").value; // 判断参数必须为数字 if(isNaN(first) || isNaN(second)){ // isNaN is not a number alert("输入参数 必须为数字!"); return false; } if(second==0 && operator == '/'){ alert("除数不能为0!"); return false; } } </script> </head> <body> <!-- 计算form表单 --> <h3>简单的计算器</h3> <form action="/lesson11/CalculatorServletDemo2" method="post" onsubmit="checkForm();"> <table> <tr> <td>第一个参数</td> <td> <!-- 使用 setProperty * form输入项name 必须和 javabean类属性一致 --> <input type="text" name="firstNum" id="first"/> </td> </tr> <tr> <td>运算符</td> <td> <select name="operator" id="operator"> <option value="+">+</option> <option value="-">-</option> <option value="*">*</option> <option value="/">/</option> </select> </td> </tr> <tr> <td>第二个参数</td> <td> <input type="text" name="secondNum" id="second" /> </td> </tr> <tr> <td colspan="2"> <input type="submit" value="计算"/> </td> </tr> </table> </form> </body> </html> |
控制层CalculatorServletDemo2.java
package com.silvan.servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.silvan.pojo.CalculatorDemo2; public class CalculatorServletDemo2 extends HttpServlet { /** * Constructor of the object. */ public CalculatorServletDemo2() { super(); } /** * Destruction of the servlet. <br> */ public void destroy() { super.destroy(); // Just puts "destroy" string in log // Put your code here } /** * The doGet method of the servlet. <br> * * This method is called when a form has its tag value method equals to get. * * @param request the request send by the client to the server * @param response the response send by the server to the client * @throws ServletException if an error occurred * @throws IOException if an error occurred */ public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //取出计算值 double firstNum = Double.parseDouble(request.getParameter("firstNum")); double secondNum = Double.parseDouble(request.getParameter("secondNum")); String operator = request.getParameter("operator"); double result = 0; //计算结果 if (operator.equals("+")) { result = firstNum + secondNum; } else if (operator.equals("-")) { result = firstNum - secondNum; } else if (operator.equals("*")) { result = firstNum * secondNum; } else if (operator.equals("/")) { result = firstNum / secondNum; } //将数据存入bean中 CalculatorDemo2 dataBean = new CalculatorDemo2(); dataBean.setFirstNum(firstNum); dataBean.setSecondNum(secondNum); dataBean.setOperator(operator); dataBean.setResult(result); request.setAttribute("bean", dataBean); //跳转到结果显示界面 request.getRequestDispatcher("/demo2/showResult.jsp").forward(request, response); } /** * The doPost method of the servlet. <br> * * This method is called when a form has its tag value method equals to post. * * @param request the request send by the client to the server * @param response the response send by the server to the client * @throws ServletException if an error occurred * @throws IOException if an error occurred */ public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } /** * Initialization of the servlet. <br> * * @throws ServletException if an error occurs */ public void init() throws ServletException { // Put your code here } } |
模型层CalculatorDemo2.java
package com.silvan.pojo; public class CalculatorDemo2 { private double firstNum; // 参数一 private double secondNum; // 参数二 private String operator; // 运算符 private double result; // 运算结果 public double getFirstNum() { return firstNum; } public void setFirstNum(double firstNum) { this.firstNum = firstNum; } public double getSecondNum() { return secondNum; } public void setSecondNum(double secondNum) { this.secondNum = secondNum; } public String getOperator() { return operator; } public void setOperator(String operator) { this.operator = operator; } public double getResult() { return result; } public void setResult(double result) { this.result = result; } } |
视图层showResult.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>calculator</title> </head> <body> <h3>运算结果</h3> <jsp:useBean id="bean" type="com.silvan.pojo.CalculatorDemo2" scope="request"></jsp:useBean> <jsp:getProperty property="firstNum" name="bean"/> <jsp:getProperty property="operator" name="bean"/> <jsp:getProperty property="secondNum" name="bean"/> = <jsp:getProperty property="result" name="bean"/> </body> </html> |
案例2
MVC模式实现登录
Login.jsp
<body> <h1>登陆表单</h1> <h3 style="color:red;">${msg }</h3> <form action="/login/LoginServlet" method="post"> <table> <tr> <td>用户名</td> <td><input type="text" name="username" /> </td> </tr> <tr> <td>密码</td> <td><input type="password" name="password" /> </td> </tr> <tr> <td colspan="2"><input type="submit" value="登陆" /></td> </tr> </table> </form> </body> |
Web.xml
<servlet> <servlet-name>LoginServlet</servlet-name> <servlet-class>com.silvan.servlet.LoginServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>LoginServlet</servlet-name> <url-pattern>/LoginServlet</url-pattern> </servlet-mapping> |
LoginServlet.java
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 解决编码问题 request.setCharacterEncoding("utf-8"); // 接收表单参数 String username = request.getParameter("username"); String password = request.getParameter("password"); // 将form 数据封装 javabean对象 User user = new User(); user.setUserName(username); user.setPassWord(password); // 传递数据javabean 给 处理javabean // 使用模型完成对用户验证 去创建一个UserModel对象,调用对应的方法 UserService userService = new UserService(); if (userService.checkUser(user)) { // 把用户名放入session,以备后用 request.getSession().setAttribute("username", username); // 合法 // 转向,跳转方法效率不高 // response.sendRedirect("welcome.jsp"); // 因为sendRedirect方法效率不高,在公司常常使用转发方法 // getRequestDispatcher方法效率高,并且可以把request请求信息往下转发 request.getRequestDispatcher("/index.jsp").forward(request, response); } else { // 不合法 request.setAttribute("msg", "用户名或密码错误!"); request.getRequestDispatcher("/Login.jsp").forward(request, response); } } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request, response); } |
User.java
public class User { private String userName; private String passWord; get/set…… } |
LoginService.java
/** * 业务逻辑层,一般归类于模型层 * @author Administrator * */ public class UserService { // 验证用户是否存在 public boolean checkUser(User user) { String driver = "oracle.jdbc.driver.OracleDriver"; String url = "jdbc:oracle:thin:@localhost:1521:XE"; String username = "zhou"; String password = "123456"; boolean flag = false; Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; try { //加载数据库连接驱动类 Class.forName(driver); //获取数据库连接 conn = DriverManager.getConnection(url,username,password); // 执行查询 String sql = "select * from USER1 where username='" + user.getUserName() + "'"; // 创建prepareStatement对象 pstmt = conn.prepareStatement(sql); //得到查询结果 rs = pstmt.executeQuery(); System.out.println("sql=" + sql); //处理查询结果 if (rs.next()) { if (user.getPassWord().equals(rs.getString("pwd"))) { // 登录成功 // 将得到的数据传给下一个页面 // 1,cookie 2,session 3 response.sendRedirect flag = true; } } } catch (Exception e) { e.printStackTrace(); } finally { //关闭数据库连接 try { if (pstmt!=null){ pstmt.close(); } if(conn!=null){ conn.close(); } if(rs!=null){ rs.close(); } } catch (SQLException e) { e.printStackTrace(); } } return flag; } } |
Index.jsp
<body> ${username }登录成功! </body> |
第十一章 Servlet MVC模式的更多相关文章
- 为什么我要放弃javaScript数据结构与算法(第十一章)—— 算法模式
本章将会学习递归.动态规划和贪心算法. 第十一章 算法模式 递归 递归是一种解决问题的方法,它解决问题的各个小部分,直到解决最初的大问题.递归通常涉及函数调用自身. 递归函数是像下面能够直接调用自身的 ...
- 《javascript设计模式》笔记之第十章 和 第十一章:门面模式和适配器模式
第十章:门面模式 一:门面模式的作用 简化已有的api,使其更加容易使用 解决浏览器的兼容问题 二:门面模式的本质 门面模式的本质就是包装已有的api来简化操作 三:门面模式的两个简单例子 下面这 ...
- MVC模式和Spring MVC初识
概述 传统的Model1和Model2 在Model1的模式下,整个Web应用几乎全部是由JSP页面组成,接受和处理用户请求,并对请求处理后直接做出响应:JSP身兼View和Controller两个角 ...
- 基于jsp+servlet+javabean的MVC模式简单应用
原先写在CSDN的一篇,我直接扒过来吧.之前打算在CSDN的,结果写了几回,发现他那个发布系统简直烂到家,经常丢失图片各种.所以很长一段时间我也没写什么. 一.MVC模式 1.M : javabea ...
- 基于Servlet的MVC模式用户登录实例
关于MVC模式的简单解释 M Model,模型层,例如登录实例中,用于处理登录操作的类: V View,视图层,用于展示以及与用户交互.使用html.js.css.jsp.jQuery等前端技术实现: ...
- Pro ASP.NET MVC –第三章 MVC模式
在第七章,我们将创建一个更复杂的ASP.NET MVC示例,但在那之前,我们会深入ASP.NET MVC框架的细节:我们希望你能熟悉MVC设计模式,并且考虑为什么这样设计.在本章,我们将讨论下列内容 ...
- JSP——MVC模式+Servlet生命周期
设计模式MVC模式 模型MODEL操作数据库的增删改查——javaBean 视图VIEW显示数据——JSP 控制器CONTROLLER响应用户的——servlet Model(模型),是程序的主体部分 ...
- Jsp+Servlet+JavaBean经典MVC模式理解
MVC模式目的(实现Web系统的职能分工). 在Java EE中,Jsp+Servlet+JavaBean算是里面经典的模式,是初学者必备的知识技能.M, Model(模型)实现系统的业务逻辑 1.通 ...
- JavaWeb -- Servlet+JSP+JavaBean(MVC)模式
Servlet+JSP+JavaBean(MVC)模式适合开发复杂的web应用,在这种模式下,servlet负责处理用户请求,jsp负责数据显示,javabean负责封装数据. Servlet+JSP ...
随机推荐
- BZOJ 3674 可持久化并查集加强版(按秩合并版本)
/* bzoj 3674: 可持久化并查集加强版 http://www.lydsy.com/JudgeOnline/problem.php?id=3674 用可持久化线段树维护可持久化数组从而实现可持 ...
- Storm同时接收多个源(spout和bolt)
参考: http://blog.csdn.net/nyistzp/article/details/51483779
- Android自己定义RatingBar
注意rating_background图片做出来的图片最好和图片四周有一定的空隙.不然会造成图片底部被拉伸的情况. <RatingBar android:layout_width="w ...
- Android 多个APK共享数据
Android给每个APK进程分配一个单独的用户空间,其manifest中的userid就是对应一个Linux用户(Android 系统是基于Linux)的.所以不同APK(用户)间互相访问数据默认是 ...
- Spark SQL 编程API入门系列之SparkSQL数据源
不多说,直接上干货! SparkSQL数据源:从各种数据源创建DataFrame 因为 spark sql,dataframe,datasets 都是共用 spark sql 这个库的,三者共享同样的 ...
- C# web api 中过滤器的使用
一.开篇 Fiter在Web API中经常会用到,主要用于记录日志,安全验证,全局错误处理等:Web API提供两种过滤器的基本类型:actionfilterattribute,exceptionfi ...
- Windows 10 游戏录制工具栏
- 取消overflow-scroll的滚动条
通常情况下设置完overflow:scroll之后,就会在页面中出现滚动条,下边的方法可以取消掉此滚动条: container为当前设置overflow:scroll的元素 1.使用以下CSS可以隐藏 ...
- 解决 Windows XP 下 IIS 最大连接数为 10 的问题
为了方便调试网站程序,就在 Windows XP 系统下安装了 IIS,但是出现了一个问题:“403.9 误-禁止访问:连接的用户过多”,会有这样的问题出现,一般有两种可能:一.IIS 本身的最大连接 ...
- 【fiddler】 fiddler总是在菜单栏下面弹出提示“The system proxy was changed,click to reenable fiddler capture”--转
源地址:http://blog.csdn.net/htdeyanlei/article/details/52873060 标签: fiddler 2016-10-20 15:28 2747人阅读 评论 ...