第十一章 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 ...
随机推荐
- 编译驱动模块所需的Makefile
目标定义:就是用来定义哪些内容作为模块编译,哪些内容要编译并链接进内核. obj-y += foo.o 表示要由foo.c或者foo.s文件编译得到foo.o并链接进内核: obj-m则表示该文件要作 ...
- HDU 2035 不忍直视的水
#include <iostream> #include <cstdio> #include <algorithm> using namespace std; in ...
- Android Touch事件分发过程
虽然网络上已经有非常多关于这个话题的优秀文章了,但还是写了这篇文章,主要还是为了加强自己的记忆吧,自己过一遍总比看别人的分析要深刻得多.那就走起吧. 简单演示样例 先看一个演示样例 : 布局文件 : ...
- 不做Next,争做Nest——庆科首届智能硬件创新设计大赛产生决赛12强
智能硬件,Wi-Fi互联,谁是下一个Nest?邀你共见证! 2014年3月到7月.由上海庆科信息技术有限公司主办的首届 MXCHIP 智能硬件创新设计大赛--"寻找下一个nest&quo ...
- 百度编辑器图片在线流量返回url改动
百度编辑器中返回的是我们server中的url,有时并非我们须要的,比方图文编辑中.我想在线浏览上传过的图片 ,那么我返回的应该是腾讯server上面的url.这样才不会被腾讯的过滤器过来掉,全部我们 ...
- BZOJ:3441 乌鸦喝水
bzoj:3441 乌鸦喝水 题目传送门 Description 一只乌鸦在自娱自乐,它在面前放了n个有魔力的水缸,水缸里装有无限的水. 他准备从第1个水缸飞到第n个水缸,共m次.在飞过一个水缸的过程 ...
- ORACLE查询闪回
在Oracle中如果错误地提交了修改操作,然后想查看修改前的值,这时候可以使用查询闪回(query flashback). 查询闪回可以根据根据一个时间值或者系统变更号(SCN)进行. 执行闪回操作, ...
- linux + nginx 的配置优化
linux 关于TCP/IP 的优化配置 配置文件/etc/sysctl.conf 修改完文件生效的命令 /sbin/sysctl -p 如下是总结的配置内容及说明 net.ipv4.con ...
- Chosen:Select 选择框的华丽变身
HTML Form 表单里的各种组件,例如文本输入框,textarea,按钮等,都可以通过CSS或其它技术进行美化,让它们看起来很漂亮了,唯独下拉列表选项框(select box),不管你怎么做,它摆 ...
- Android Studio 一些注意事项(自用,不定期更新)
1,Android Studio 版本的选择 写这篇的时候,官方版本已经到了 v3.2.0,而我习惯使用的版本是 v2.3.1,因为这个版本有自带sdk的安装版,比较方便, 同时,v2.3.1 新建项 ...