1、采用MVC,不仅要求业务逻辑和表示分离。实际上,业务逻辑甚至根本不知道表示的存在。MVC的关键是,业务逻辑要与表示分离,而要求在中间放上别的东西,这样业务逻辑本身就可以作为一个可以重用的Java类存在,它根本不用对视图有所了解。

2、MVC迷你教程,创建和部署MVC Web应用。

第一步:分析用户视图,以及高层体系结构

第二步:创建用于开发这个项目的开发环境

第三步:创建用于部署这个项目的部署环境

第四步:对Web应用的各个组件完成迭代的开发和测试

第一步:分析用户视图,以及高层体系结构(方便以后“从容地”扩展这个应用)

第二步:创建用于开发这个项目的开发环境

使用标准的包结构,这样才能得到包的所有好处:项目管理,命名空间管理,可移植和可重用。

第三步:创建用于部署这个项目的部署环境

第四步:对Web应用的各个组件完成迭代的开发和测试

Ⅰ、构建和测试用户最初请求的HTML表单

Ⅱ、构建控制器servlet的第一个版本,并用前面的HTML表单测试这个控制器

Ⅲ、为专家/模型类构建一个测试类,然后构建并测试专家/模型类本身

Ⅳ、把servlet升级到第二个版本,该版本增加一个功能,可以调用模型类来得到啤酒建议

Ⅴ、构建JSP,把servlet升级到第三个版本(把表示分派到JSP),然后再测试整个应用

Ⅰ、构建和测试用户最初请求的HTML表单

创建form.html

<!DOCTYPE html>
<html>
<head>
<meta charset="{CHARSET}">
<title>form.html</title>
</head>
<body>
<!--在html看来,SelectBeer.do就是要调用的servlet-->
<h1 align="center">Beer Selection Page</h1>
<form method="post" action="SelectBeer.do">
<p>select beer characteristics</p>
Color:
<select name="color" size="1">
<option>light</option>
<option>amber</option>
<option>brown</option>
<option>dark</option>
</select>
<br />
<center>
<input type="submit" />
</center>
</form>
</body>
</html>

部署并测试

在开发环境的etc文件下创建部署描述文件web.xml

<?xml version="1.0" encoding="ISO-8859-1" ?>

<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4"> <servlet>
<servlet-name>Ch3 Beer</servlet-name>
<servlet-class>com.example.web.BeerSelect</servlet-class>
</servlet> <servlet-mapping>
<servlet-name>Ch3 Beer</servlet-name>
<url-pattern>/SelectBeer.do</url-pattern>
</servlet-mapping> </web-app>

部署并测试

流程详解:把逻辑名映射到servlet文件

Ⅱ、构建控制器servlet的第一个版本,并用前面的HTML表单测试这个控制器

idea快速重写父类方法的快捷是ctrl+0.

package com.example.web;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter; public class BeerSelect extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 之所以是doPost,是因为在html中的表单指出method=post
resp.setContentType("text/html");
PrintWriter out = resp.getWriter();
out.println("Beer Selection Advice<br>");
String c = req.getParameter("color");
out.println("<br>Got beer color" + c);
}
}

把.class文件部署到相应的tomcat目录下,重启tomcat(必要的!),完成测试。如果在这个时候如果对.class文件有修改,只有重启tomcat才能生效,对于html的修改则不是必须的。

Ⅲ、为专家/模型类构建一个测试类,然后构建并测试专家/模型类本身

如何用junit编写测试类?单元测试

package com.example.model;

import java.util.*;

public class BeerExpert {

    public List getBrands(String color) {
List brands = new ArrayList();
if (color.equals("amber")) {
brands.add("Jack Amber");
brands.add("Red Moose");
} else {
brands.add("Jail Pale Ale");
brands.add("Gout Stout");
}
return brands;
}
}

Ⅳ、把servlet升级到第二个版本,该版本增加一个功能,可以调用模型类来得到啤酒建议

package com.example.web;

import com.example.model.BeerExpert;

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*; public class BeerSelect extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 之所以是doPost,是因为在html中的表单指出method=post
resp.setContentType("text/html");
PrintWriter out = resp.getWriter();
out.println("Beer Selection Advice<br>");
String c = req.getParameter("color");
// out.println("<br>Got beer color " + c);
BeerExpert be = new BeerExpert();
List result = be.getBrands(c);
Iterator it = result.iterator();
while (it.hasNext()) {
out.print("<br>try: " + it.next());
}
}
}

Ⅴ、构建JSP,把servlet升级到第三个版本(把表示分派到JSP),然后再测试整个应用

result.jsp

<%@ page import="java.util.*" %>

<html>
<body>
<h1 align="center">Beer Recommendations JSP</h1>
<p>
<%
List styles = (List)request.getAttribute("styles");
Iterator it = styles.iterator();
while (it.hasNext()) {
out.print("<br>try: " + it.next());
}
%>
</body>
</html>

package com.example.web;

import com.example.model.BeerExpert;

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*; public class BeerSelect extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 之所以是doPost,是因为在html中的表单指出method=post
// resp.setContentType("text/html");
// PrintWriter out = resp.getWriter();
// out.println("Beer Selection Advice<br>");
String c = req.getParameter("color");
// out.println("<br>Got beer color " + c);
BeerExpert be = new BeerExpert();
List result = be.getBrands(c);
// Iterator it = result.iterator();
// while (it.hasNext()) {
// out.print("<br>try: " + it.next());
// }
req.setAttribute("styles", result); // 为请求增加一个属性,供JSP使用。 RequestDispatcher view = req.getRequestDispatcher("result.jsp"); // 为JSP实例化一个请求分派器 view.forward(req, resp); // 使用请求分派器要求容器准备好JSP,并向JSP发送请求和响应
}
}

【Head First Servlets and JSP】笔记2:MVC迷你教程的更多相关文章

  1. Head First Servlets & JSP 学习笔记 第三章 —— MVC迷你教程

    临渊羡鱼,不如退而结网!是时候动手搞事情了! 我们的四大步骤: ①分析用户的视图(也就是浏览器要显示的东西),以及高层体系结构: (这个就是所谓的前端吧?用JSP?JSP可以当成Html来用吧?高层体 ...

  2. jsp学习笔记:mvc开发模式

    jsp学习笔记:mvc开发模式2017-10-12 22:17:33 model(javabe)与view层交互 view(视图层,html.jsp) controller(控制层,处理用户提交的信息 ...

  3. 【Head First Servlets and JSP】笔记23:Expression Language(EL) 完全攻略

    基本上是<Head First Servlets and JSP>内容的整理.扩充.顺便推荐一个供参考的JSP教程:JSP Tutorial内容很全面,还有一些有趣的实例. 完整代码参考 ...

  4. 无废话MVC入门教程笔记

    自学mvc,看了园子里李林峰写的李林峰写的无废话MVC入门教程笔记,现在有的平时忽略的或是不太清楚的点记下来 1,Html.DropDownList //服务端写法 @{ //下拉列表的值 List& ...

  5. Spring MVC 入门教程示例 (一)

    今天和大家分享下  Spring MVC  入门教程 首先还是从 HelloWorld  web 工程开始 -------------------------- 1.首先创建一个Maven Web工程 ...

  6. Spring MVC新手教程(二)

    第一篇文章宏观讲了Spring MVC概念,以及分享了一个高速入门的样例. 这篇文章主要来谈谈Spring MVC的配置文件. 首先来谈谈web.xml: web项目启动时自己主动载入到内存中的信息, ...

  7. [译]MVC网站教程(四):MVC4网站中集成jqGrid表格插件(系列完结)

    目录 1.   介绍 2.   软件环境 3.   在运行示例代码之前(源代码 + 示例登陆帐号) 4.         jqGrid和AJAX 5.         GridSettings 6.  ...

  8. [译]MVC网站教程(三):动态布局和站点管理

    目录 1.   介绍 2.   软件环境 3.   在运行示例代码之前(源代码 + 示例登陆帐号) 4.   自定义操作结果和控制器扩展 1)   OpenFileResult 2)   ImageR ...

  9. [译]MVC网站教程(二):异常管理

    介绍 “MVC网站教程”系列的目的是教你如何使用 ASP.NET MVC 创建一个基本的.可扩展的网站. 1)   MVC网站教程(一):多语言网站框架 2)   MVC网站教程(二):异常管理 3) ...

随机推荐

  1. push certificate

    developer_identity.cer <= download from Applemykey.p12 <= Your private key openssl x509 -in de ...

  2. flask-第三方组件

    flask-script  离线脚本 from flask_demo import create_app from flask_script import Manager app = create_a ...

  3. Android 电源管理 -- wakelock机制

    转载地址:http://blog.csdn.net/wh_19910525/article/details/8287202 Wake Lock是一种锁的机制, 只要有人拿着这个锁,系统就无法进入休眠, ...

  4. svn服务器配置 for mac

      本文转载至 http://blog.sina.com.cn/s/blog_5e42f31a010156z4.html 1.找到合适的目录,新建一个版本库的目录:mkdir svn 创建版本库:sv ...

  5. JavaWeb项目中文乱码问题

    1.从浏览器读数据乱码(post 请求方式) 前提是前端页面是UTF-8编码,因为服务器端默认采用ISO解码,所以乱码,在读取前加上: request.setCharacterEncoding(&qu ...

  6. Audit logon events&Logon type

    表一.Logon type 表二.Audit logon events 表三.Logon type details Logon type Logon title Description 2 Inter ...

  7. VC的CListCtrl控件

    1. CListCtrl 样式及设置 2. 扩展样式设置 3. 数据插入 4. 一直选中Item 5. 选中和取消选中Item 6. 得到CListCtrl中所有行的checkbox的状态 7. 得到 ...

  8. 报错:PermissionError: [WinError 5] Access is denied: 'C:\\Program Files\\Anaconda3\\Lib\\site-packages\\pywebhdfs'

    Outline 在本(Windows系统)地往 “PAI”(hdfs)上上传数据时,需要安装pywebhdfs包,然后就报错了: 报错信息: PermissionError: [WinError 5] ...

  9. socketserver模块、MySQL(数据库、数据表的操作)

    一.socketserver实现并发 基于tcp的套接字,关键就是两个循环,一个链接循环,一个通信循环. socketserver模块中分两大类:server类(解决链接问题)和request类(解决 ...

  10. 用仿ActionScript的语法来编写html5——第四篇,继承与简单的rpg

    第四篇,继承与简单的rpg 这次用继承自LSprite的类来实现简单的rpg的demo先看一下最后的代码与as的相似度 var backLayer; //地图 var mapimg; //人物 var ...