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

们的四大步骤:

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

(这个就是所谓的前端吧?用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. Sonya and Exhibition 1004B

    B. Sonya and Exhibition time limit per test 1 second memory limit per test 256 megabytes input stand ...

  2. C++复习:多态

    多态 问题引出(赋值兼容性原则遇上函数重写)     面向对象新需求     C++提供的多态解决方案     多态案例     多态工程意义         面向对象三大概念.三种境界(封装.继承. ...

  3. 1test

    Tencent's outsize influence in China's online world is ballast that should steady it as it targets b ...

  4. Haskell语言学习笔记(75)Conduit

    安装 conduit $ cabal install conduit Installed conduit-1.3.0.3 Prelude> import Conduit Prelude Cond ...

  5. 创建一个Maven Web应用程序

    1 在Eclipes创建maven,首先File new ,在other 中找到Maven,Maven Project,下一步选择WebApp,创建Maven工程名字,完成 2 在新建的Maven工程 ...

  6. 吴裕雄 oracle PL/SQL编程

  7. js基础-类型转换

    显示类型转换 Number() 将任意类型转换数值类型 true 1 false 0 Number(null) => 0 Number(undefined) => NAN Number(' ...

  8. ASP.NET 三级联动

    三级联动就是用三个下拉列表框DropDownList,每个里面添加相应的东西,在第一个列表框中选择一个值,第二三个列表框都会根据第一个选择进行相应的变化,在第二个列表框中选择一个值,第三个列表框也会根 ...

  9. SAP 优缺点

    1.优点: SAP是全球所有ERP产品中对企业构架和财务控制考虑得最细致的系统,也是整体控制逻辑和整体系统结构是最严谨的系统,可以让企业引进先进的管理理念: 对产品在各种行业的适用性考虑得最多的系统, ...

  10. workerman Channel组件全局广播

    <?phpuse Workerman\Worker; require_once '../../web/Workerman/Autoloader.php';require_once '../../ ...