渊羡鱼,不如退而结网!是时候动手搞事情了!

们的四大步骤:

分析用户的视图(也就是浏览器要显示的东西),以及高层体系结构;

(这个就是所谓的前端吧?用JSP?JSP可以当成Html来用吧?高层体系结构,这个没听过)

创建用于开发这个项目的开发环境;

(这个说简单也简单,说难也难啊!不少好汉被这个难住了)

创建用于部署这个项目的部署环境;

(同②)

对Web应用的各个组件完成迭代式的开发和测试。

(好高深。。。好学术。。。迭代式?)

我们的Web应用是一个啤酒顾问(Beer Advisor)。尽管这是一个非常小的应用,但我们要使用一个简单的MVC体系结构来构建(原来高层体系结构说的就是MVC体系结构)。

应用内部的具体流程:

1.客户请求得到form.html页面。

2.容器获得form.html页面。

3.容器把这个页面返回给浏览器,用户再在浏览器上回答表单上的问题。

4.用户问题回答完毕点击提交,浏览器把请求数据发送到容器。

5.容器根据URL找到正确的Servlet,并把请求传递给这个Servlet。

6.Servlet调用模型BeerExpert,寻求模型的帮助。

7.模型BeerExpert返回一个回答,Servlet把这个回答增加到请求对象。

8.Servlet把请求转发给JSP。(不理解,不懂是怎么转发的?)

9.JSP从请求对象得到回答。(不理解)

10.JSP为容器生成一个页面。(不理解,JSP怎么生成一个页面的?)

11.容器把这个页面返回给客户。

中使用的是Tomcat5,由于第一章中的小例子在部署Web应用中就遇到了问题,这次还是先暂时跟着书来,如果还是不行就按照自己的方式进行修改。

前面的四大步骤先不管①②③,直接看④。第④步又分为5个小步骤:

④a:构建和测试用户最初请求的Html表单;④b:构建控制器Servlet的第一个版本;④c:为模型类构建一个测试类,然后构建模型类本身;④d:把Servlet升级到版本2,这个版本增加一个功能,可以调用模型类来得到啤酒建议; ④e:构建JSP,把Servlet升级到版本3,再增加一个功能,可以把表示分配到JSP完成,然后再测试整个应用。

④a:第一个表单页面的html

(保存为from.html,保存到F:/Beer/web目录下,这个是开发环境,然后再把这个文件复制到tomcat/webapps/Beer中,这个是部署环境)(部署环境的tomcat目录就是你安装的Tomcat的根目录,下面有webapps目录)

 <!doctype html>
<html>
<head>
<meta charset="utf-8" />
<title>Beer Selection</title>
</head>
<body>
<h1 style="text-align:center">Beer Selection Page</h1>
<form style="text-align:center" method="post" action="SelectBeer.do"> //anction表示表单数据提交到SelectBeer.do这个Servlet,这个名字只是一个逻辑名字,不是Servlet的真正名字,也不是Servlet类的类名
<p>Select beer characteristics</p>
<span>Color:</span>
<select name="color" size="1">
<option value="light">light</option>
<option value="amber">amber</option>
<option value="brown">brown</option>
<option value="dark">dark</option>
</select>
<br /><br />
<input style="text-align:center" type="submit" value="提交" />
</form>
</body>
</html>

在开发环境中创建DD(部署描述文件——web.xml)

将其保存到F:/Beer/etc目录下,然后再复制到tomcat/webapps/Beer/WEB-INF目录下,这个是部署环境

<?xml version="1.0" encoding="utf-8"?>
<web-app>
<servlet>
<servlet-name>Ch3 Beer</servlet-name>
<servlet-class>com.example.web.BeerServlet</servlet-class> //Servlet真正的名字,com.example.web是包名
</servlet>
<servlet-mapping>
<servlet-name>Ch3 Beer</servlet-name> //Servlet的内部名字
<url-pattern>/SelectBeer.do</url-pattern> //Servlet的逻辑名字,对用户名字
</servlet-mapping>
</web-app>

测试form.html页面:

上面做好后,启动Tomcat,在浏览器地址栏输入:http://127.0.0.1:8080/Beer/form.html,应该能正常显示form.html页面。

Servlet版本一:

(保存到开发环境:F:/Beer/src/com/example/web/BeerServlet.java)

package com.example.web; //包名

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*; public class BeerServlet extends HttpServlet{ //继承了HttpServlet
public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException{ //将异常抛出
response.setContentType("text/html; charset=utf-8"); //设置响应对象的编码 PrintWriter out = response.getWriter();
out.println("Beer Selection Advice<br />"); //简单地输出一段信息 String c = request.getParameter("color"); //获取请求中的color属性
out.println("<br />Got beer color " + c); //把选中的颜色输出
}
}

编译Servlet:

(先在F:/Beer文件夹中新建一个classes目录,用来存放.class文件)

win + r + cmd进入windows命令行,依次输入如下命令:

 F: //先进入F盘
cd Beer //再进入Beer目录
javac -classpath F:/tomcat/common/lib/servlet-api.jar;classes -d classes -encoding utf8 src/com/example/web/BeerServlet.java //编译BeerServlet.java,其中tomcat/com/lib前面的盘根据自己的情况来写,我自己是F盘

编译成功后,会发现F:/Beer/classes目录下有com/example//web/BeerServlet.class文件,它编译的时候把包目录也自动生成了。(但是如果没有一开始的classes目录就会编译错误)

部署Servlet:

(复制F:Beer里面的classes目录,将其复制到部署目录F:/tomcat/webapps/Beer/WEB-INF目录下,所以部署目录会是:F:/tomcat/webapps/Beer/WEB-INF/classes/com/example/web/BeerServlet.class。部署完成之后,就测试Servlet。重启Tomcat,在浏览器地址栏中输入:http://127.0.0.1:8080/Beer/form.html  然后选择一个颜色,点击提交按钮,会看到一个新的页面,其中显示了你选择的颜色!

构建和测试模型

(模型,大多数情况下只是普通的Java代码,根本不知道自己会被Servlet调用。编写完后保存到开发环境:F:/Beer/src/com/example/model/BeerExpert.java)

 package com.example.model; //包名

 import java.util.*;

 public class BeerExpert{
public List getBrands(String color){ //返回一个List列表
List<String> 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;
}
}

编译BeerExpert.java:

win + r + cmd 进入windows命令行,依次输入如下命令:

 F:
cd Beer
javac -d classes -encoding utf8 src/com/example/model/BeerExpert.java

改进Servlet,版本2:

(调用模型来得到建议。在开发环境,F:/Beer/src/com/example/web/BeerServlet.java,修改版本1中的Servle)

 package com.example.web;

 import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*; //新增
import com.example.model.BeerExpert; //新增 public class BeerServlet extends HttpServlet{
public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException{
response.setContentType("text/html; charset=utf-8"); PrintWriter out = response.getWriter();
out.println("Beer Selection Advice<br />"); String c = request.getParameter("color");
List result = new BeerExpert().getBrands(c); //新增 Iterator it = result.iterator(); //新增
while(it.hasNext()){
out.print("<br />try: " + it.next());
}
}
}

到这里还是没有理解前面具体流程中8、9、10。因为JSP还没有发挥作用。

重新编译BeerServlet.java

win + r + cmd ,进入命令行,和第一次编译BeerServlet的命令一样:

 F:
cd Beer
javac -classpath F:/tomcat/common/lib/servlet-api.jar;classes -d classes -encoding utf8 src/com/example/web/BeerServlet.java //-classpath用来指定类路径,当指定多个类路径时,用“;”分号进行分隔,例如这句命令就指定了两个

把重新编译生成的BeerServlet.class复制到部署环境:F:/tomcat/webapps/Beer/WEB-INF/classes/com/example/web目录下,替换之前的版本1的BeerServlet.class。

部署模型的类文件:

把上面编译好的BeerExpert.class复制到的部署环境:F:/tomcat/webapps/Beer/WEB-INF/classes/com/example/model目录下,没有就自己新建一个model文件夹。

关闭Tomcat并重启,验证模型:

在浏览器地址栏输入http://127.0.0.1:8080/Beer/form.html,可以发现选择“amber”这个颜色时,会推荐Jack Amber 、Red Moose这两种酒,选择其他颜色时,会推荐Jail Pale、 AleGout Stout,说明模型成功运行了。

创建JSP,再部署JSP:

一个非常简单的JSP,命令为result.jsp,先保存在开发环境F:/Beer/web 文件夹中。然后复制这个result.jsp到部署环境:F:/tomcat/webapps/Beer 文件夹中,和上面的form.html同级。

 <%@ page import="java.util.*" %>
<!doctype html>
<html>
<head>
<meta charset="utf-8" />
<title>result_jsp</title>
</head>
<body>
<h1 style="text-align:center">Beer Recommendations JSP</h1> <%
List<String> styles = (List)request.getAttribute("styles");
Iterator it = styles.iterator();
while(it.hasNext()){
out.print("<br />try: " + it.next());
}
%>
</body>
</html>

继续改进Servlet,得到版本3:

这一步,要把Servlet修改为“调用”JSP来生成输出(视图)。容器提供了一种称为“请求分派”的机制,允许容器管理的一个组件调用另一个组件。我们就会使用这种机制,Servlet从模型中得到消息,把它保存在请求对象中,然后把请求对象分派给JSP。

 package com.example.web;

 import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
import com.example.model.BeerExpert; public class BeerServlet extends HttpServlet{
public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException{
//response.setContentType("text/html; charset=utf-8");
//既然要由JSP来生成输出,Servlet的测试输出就没用了
//PrintWriter out = response.getWriter();
//out.println("Beer Selection Advice<br />"); String c = request.getParameter("color");
List result = new BeerExpert().getBrands(c); request.setAttribute("styles", result); //为请求对象设置一个属性,供JSP使用 request.getRequestDispatcher("result.jsp").forward(request, response);
// 为JSP实例化一个请求分派器(这不就是服务器端的跳转嘛?)
//forward(request, response),这个是使用请求分派器要求容器准备好JSP,并向JSP发送请求和响应
}
}

编译、部署和最后的测试:

 F:
cd Beer
javac -classpath F:/tomcat/common/lib/servlet-api.jar;classes -d classes -encoding utf8 src/com/example/web/BeerServlet.java

把新的BeerServlet.class文件复制到部署环境中,替换掉之前的。

然后关闭Tomcat并重启,在浏览器中输入http://127.0.0.1:8080/Beer/form.html

选择颜色“amber”点击“提交”后,出现Beer Recommendations JSP页面,建议Jack Amber 和 Red Moose;

选择颜色“light”,建议 Jail Pale Ale 和 Gout Stou。说明JSP生成视图成功。

总结:

这一章学习了简单的MVC设计模式,写了一个BeerExpert类作为模型,这个模型的作用是根据控制器传给它的颜色,来做出酒的推荐;写了一个result.jsp来作为视图,这个视图的使用方式是:Servlet把用户提交的颜色参数传给模型,模型给出建议,建议保存在List列表中,Servlet根据生成的建议,对请求对象增加一个属性styles,这个属性styles中肯定要么指向建议,要么就保存着建议,然后Servlet在进行服务器端的跳转,跳转到result.jsp页面(书上说是实例化一个请求分派器,并向JSP发送请求和响应);然后JSP页面上有一段Java代码,这段代码获取请求上的属性styles,并把styles中的内容打印出来。

Head First Servlets & JSP 学习笔记 第三章 —— MVC迷你教程的更多相关文章

  1. Head First Servlets & JSP 学习笔记 第七章 —— 作为JSP

    <%@ …… %> 这是指令 <%@ page ……import="java.util.Date" %> 这是page指令,import是page指令的一个 ...

  2. Head First Servlets & JSP 学习笔记 第五章 —— 作为Web应用

    初始化参数:(init-param) 初始化参数写在web.xml文件中:(写在<servlet>标签内部) <servlet> <servlet-name>Bee ...

  3. Head First Servlets & JSP 学习笔记 第十一章 —— Web应用部署

    jar:java archive(java归档) war:web archive(web归档) war文件只是Web应用结构的一个快照,采用了一种更可移植的压缩形式(它实际上就是一个jar文件).建立 ...

  4. Head First Servlets & JSP 学习笔记 第十三章 —— 过滤器的威力

    过滤器可能是最强大的Web应用开发工具了! 与Servlet非常类似,过滤器就是Java组件,请求发送到Servlet之前,可以用过滤器截获和处理请求:另外Servlet结束工作之后,但在响应发回给客 ...

  5. Head First Servlets & JSP 学习笔记 第六章 —— 会话状态

    MVC中的M(模型),通常就是一个普通的类,这个类里面的信息就是业务逻辑. 会话(Session) 我们可以使用一个HttpSession对象,来保存横跨多个请求的会话状态. HTTP协议使用的是无状 ...

  6. Head First Servlets & JSP 学习笔记 第四章 —— 作为Servlet

    Servlet的任务是得到一个客户的请求,再发回一个响应. 请求: 容器控制着Servlet的一生,它会创建请求和响应对象.为Servlet创建一个新线程或分配一个线程,另外调用Servlet的ser ...

  7. 《DOM Scripting》学习笔记-——第三章 DOM

    <Dom Scripting>学习笔记 第三章 DOM 本章内容: 1.节点的概念. 2.四个DOM方法:getElementById, getElementsByTagName, get ...

  8. .NET MVC 学习笔记(三)— MVC 数据显示

    . NET MVC 学习笔记(三)—— MVC 数据显示 在目前做的项目中,用的最多的数据展示控件就是table展示(说不是的请走开,不是一路人),以下详细阐述下table的使用方法. 先看效果: 上 ...

  9. The Road to learn React书籍学习笔记(第三章)

    The Road to learn React书籍学习笔记(第三章) 代码详情 声明周期方法 通过之前的学习,可以了解到ES6 类组件中的生命周期方法 constructor() 和 render() ...

随机推荐

  1. 如何判定耿耿数已经被bind过?

    这个只有原生bind才有这福利 var fn1 = function(){} var a = {} var b = fn1.bind(a) console.log(b.name) // "b ...

  2. 遍历DOM树,获取父节点

    通过获取父节点,还可以获取父节点的父节点. 有3个常用方法: 方法  说明  parent()  选取父节点  parents()  选取所有父节点  parentsUntil("div&q ...

  3. [Shell]Bash基本功能:历史命令 & 别名 & Bash快捷键

    /*----------------------------------------------------------------------------------------------- @黑 ...

  4. week5 0.1 安装materializecss

    用ATOM打开项目 App是什么呢?就是App.js 我们将不需要的删掉 用一下materialize(类似bootstrap的东西) 官网https://materializecss.com/ 想用 ...

  5. [Android] Robotium手机自动化测试(仅需apk安装包版)——环境搭建 【转】

    Robotium的手机自动化测试,很多都是利用app源代码里的Id定义来开发自动化脚本.而在我开始要为项目中的app写自动化测试脚本的时 候,开发的环境还很不稳定,app也还处于开发的状态中,而且,在 ...

  6. EF 数据查询效率对比

    优化的地方: 原地址:https://www.cnblogs.com/yaopengfei/p/9226328.html ①:如果仅是查询数据,并不对数据进行增.删.改操作,查询数据的时候可以取消状态 ...

  7. k近邻算法(KNN)

    k近邻算法(KNN) 定义:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别. from sklearn.model_selection ...

  8. k8s operator

    https://coreos.com/blog/introducing-operators.html Site Reliability Engineer(SRE)是通过编写软件来运行应用程序的人员. ...

  9. windows环境安装zabbix客户端

    安装windows版zabbix客户端 一.下载客户端 在数据盘新建一个zabbix_agent目录 浏览器打开 https://www.zabbix.com/download_agents 选择”z ...

  10. Signed Distance Field Technique

    [Distance Field Technique] 一种小纹理高清放大的技术. A distance field is generated from a high resolution image, ...