内包含案例,基于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. Oracle解除表锁定问题

    1.肯定是你同时打开了多个操作页面,要记得关闭多个打开的sql窗口. 2.可以变相删除表,再重新创建一张同名的表来解除表被锁住的问题

  2. 最全Pycharm教程(38)——Pycharm版本号控制之远程共享

    1.主题 介绍怎样通过GitHub共享你的本地Git版本号库 2.准备工作 (1)Pycharm版本号为2.7或者更高 (2)Git以及GitHub可用 (3)有GitHub storage的读写权限 ...

  3. How to remove focus without setting focus to another control?

    How to remove focus without setting focus to another control? Ask Question up vote 67 down vote favo ...

  4. 40.DOM读取XML

    main.cpp #include <QtGui> #include <iostream> #include "domparser.h" int main( ...

  5. BZOJ 3667 Pollard-rho &Miller-Rabin

    论O(1)快速乘和O(logn)快速乘的差距-. //By SiriusRen #include <cstdio> #include <algorithm> using nam ...

  6. POJ 2923 DP

    题意: 两辆车去运一堆货物,货物数量小于等于10,问最少需要几趟能把货物全部运到目的地. 思路: 思路很简单,就是状态压缩成二进制.判断一下每个状态能不能运输.再进行一下DP. 设s[]数组里记录所有 ...

  7. java代码实现python2中aes加密经历

    背景: 因项目需要,需要将一个python2编写的aes加密方式改为java实现. 1.源python2实现 from Crypto.Cipher import AES from binascii i ...

  8. FluentAPI配置

    基本 EF 配置只要配置实体类和表.字段的对应关系.表间关联关系即可. 如何利用 EF的高级配置,达到更多效果:如果数据错误(比如字段不能为空.字符串超长等),会在 EF 层就会报错,而不会被提交给数 ...

  9. 五步完成一个 VSCode 扩展(插件)开发

    第一步: 安装扩展生成器 npm install -g yo generator-code vsce 第二步: 初始化一个 Hello World 扩展 yo code 图来自 CN-VScode-D ...

  10. 谈谈javascript中原型继承

    什么是继承?拿来主义:自己没有,别人有,把别人的拿过来使用或者让其成为自己的 如何实现继承的方式 原型继承 混入继承 经典继承 1. 混入继承 由于一个对象可以继承自任意的对象,即:o可以继承自对象o ...