内包含案例,基于jsp+servlet的:MVC模式计算器;MVC模式登陆

第十一章 Servlet MVC模式

模型-视图-控制器(model-view-controller),简称MVC。MVC是一种先进的设计模式,它的核心思想是有效地组合“视图”、“模型”和“控制器”。掌握MVC模式对于设计合理的Web应用框架有着十分重要的意义。

MVC是一种通过三个不同部分构造一个软件或组件的理想办法:

  • l  模型(model)用于存储数据的对象
  • l  视图(view)向控制器提交所需数据、显示模型中的数据
  • l  控制器(controller)负责具体的业务逻辑操作,即控制器根据视图提出的要求对数据做出处理,将有关结果存储到模型中,并负责让模型和视图进行必要的交互,当模型中的数据变化时,让视图更新显示。

从面向对象的角度看,MVC结构可以使程序更具有对象化特性,也更容易维护和扩展。

在JSP技术中,“视图”、“模型”和“控制器”的具体实现如下:

模型   一个或多个Javabean对象,用于存储数据,Javabean主要提供简单的setXXX方法和getXXX方法,在这些方法中不涉及对数据的具体处理细节,以便增强模型的通用性。

视图   一个或多个JSP页面,其作用主要是向控制器提交必要的数据和为模型提供数据显示,JSP页面主要使用HTML标记和Javabean标记来显示数据。

控制器   一个或多个servlet对象,根据视图提交的要求进行数据处理操作,并将有关的结果存储到Javabean中,然后servlet使用重定向方式请求视图中的某个JSP页面更新显示,即让该JSP页面通过使用Javabean标记显示控制器存储在Javabean中的数据。

 

JSP开发web项目的两种模型(Model1/Model2)

Model1JSP+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模式的更多相关文章

  1. 为什么我要放弃javaScript数据结构与算法(第十一章)—— 算法模式

    本章将会学习递归.动态规划和贪心算法. 第十一章 算法模式 递归 递归是一种解决问题的方法,它解决问题的各个小部分,直到解决最初的大问题.递归通常涉及函数调用自身. 递归函数是像下面能够直接调用自身的 ...

  2. 《javascript设计模式》笔记之第十章 和 第十一章:门面模式和适配器模式

    第十章:门面模式 一:门面模式的作用 简化已有的api,使其更加容易使用 解决浏览器的兼容问题 二:门面模式的本质 门面模式的本质就是包装已有的api来简化操作   三:门面模式的两个简单例子 下面这 ...

  3. MVC模式和Spring MVC初识

    概述 传统的Model1和Model2 在Model1的模式下,整个Web应用几乎全部是由JSP页面组成,接受和处理用户请求,并对请求处理后直接做出响应:JSP身兼View和Controller两个角 ...

  4. 基于jsp+servlet+javabean的MVC模式简单应用

    原先写在CSDN的一篇,我直接扒过来吧.之前打算在CSDN的,结果写了几回,发现他那个发布系统简直烂到家,经常丢失图片各种.所以很长一段时间我也没写什么. 一.MVC模式 1.M :  javabea ...

  5. 基于Servlet的MVC模式用户登录实例

    关于MVC模式的简单解释 M Model,模型层,例如登录实例中,用于处理登录操作的类: V View,视图层,用于展示以及与用户交互.使用html.js.css.jsp.jQuery等前端技术实现: ...

  6. Pro ASP.NET MVC –第三章 MVC模式

    在第七章,我们将创建一个更复杂的ASP.NET MVC示例,但在那之前,我们会深入ASP.NET MVC框架的细节:我们希望你能熟悉MVC设计模式,并且考虑为什么这样设计.在本章,我们将讨论下列内容 ...

  7. JSP——MVC模式+Servlet生命周期

    设计模式MVC模式 模型MODEL操作数据库的增删改查——javaBean 视图VIEW显示数据——JSP 控制器CONTROLLER响应用户的——servlet Model(模型),是程序的主体部分 ...

  8. Jsp+Servlet+JavaBean经典MVC模式理解

    MVC模式目的(实现Web系统的职能分工). 在Java EE中,Jsp+Servlet+JavaBean算是里面经典的模式,是初学者必备的知识技能.M, Model(模型)实现系统的业务逻辑 1.通 ...

  9. JavaWeb -- Servlet+JSP+JavaBean(MVC)模式

    Servlet+JSP+JavaBean(MVC)模式适合开发复杂的web应用,在这种模式下,servlet负责处理用户请求,jsp负责数据显示,javabean负责封装数据. Servlet+JSP ...

随机推荐

  1. BA-传感器

    01.室内温度传感器 壁装,西门子,QAA2061D 1.默认范围:温度0-50℃,湿度0-100% 2.供电方式:24vac 3.穿线方式:4芯屏蔽线 02.风管温度传感器 西门子,QAM2120. ...

  2. 数据库-mongodb-常用命令

    展示当前集合列表 1 show dbs 查看查询命令 1 db.stu.find().explain(); 结果中的 "cursor":"BasicCursor" ...

  3. crm高速开发之Entity

    我们在后台代码里面操作Entity的时候,基本上是这样写的: /* 创建者:菜刀居士的博客  * 创建日期:2014年07月5号  */ namespace Net.CRM.Entity {     ...

  4. 用 C 语言编写一个简单的垃圾回收器

    人们似乎觉得编写垃圾回收机制是非常难的,是一种仅仅有少数智者和Hans Boehm(et al)才干理解的高深魔法.我觉得编写垃圾回收最难的地方就是内存分配,这和阅读K&R所写的malloc例 ...

  5. Object::connect: Cannot queue arguments of type 'QMap<QString,QString>'(要使用qRegisterMetaType<StringMap>进行注册)

    QObject::connect: Cannot queue arguments of type 'QMap<QString,QString>',(Make sure 'QMap<Q ...

  6. Gradle之依赖管理

    Gradle之依赖管理 泡在网上的日子 / 文 发表于2015-01-29 16:12 第8824次阅读 Gradle,Android Studio 2 编辑推荐:稀土掘金,这是一个针对技术开发者的一 ...

  7. angularjs1-3,工具方法,bootstrap,多个module,引入jquery

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  8. UESTC--1264--人民币的构造(数学规律)

    人民币的构造 Time Limit: 1000MS   Memory Limit: 65535KB   64bit IO Format: %lld & %llu Submit Status D ...

  9. VS头部自动注释

    1.找你的vs安装目录, 比如我的是在D盘D:\Program Files\Microsoft\VS2013\Common7\IDE 2.然后点击右上角的 搜索. 搜索Class.cs文件 3.把里面 ...

  10. Hibernate框架学习(四)——事务

    一.回顾事务的概念http://www.cnblogs.com/cxq1126/p/8313600.html 1.特性ACID:原子性.一致性.隔离性.持久性 2.并发问题:脏读.不可重复读.幻|虚读 ...