一个servlet的简单mvc的创建到运行
开发环境和部署环境是不一样的
这是部署
在tomcat的webapps目录下
\webapps\Beer-v1\form.html
1 <body> 2 <h1 align="center">Beer Selection Page</h1> 3 <!-- 点submit会调到http://localhost:63342/MyFirstServlet/SelectBeer.do这个url SelectBeer.d只是一个逻辑名--> 4 <form method="post" action="SelectBeer.do"> 5 Select beer characteristics 6 <p>Color:</p> 7 <select name="color" size="1"> 8 <option>light</option> 9 <option>amber</option> 10 <option>brown</option> 11 <option>dark</option> 12 </select> 13 <br/><br/> 14 <input type="submit"> 15 </form> 16 </body> 17 </html>
\webapps\Beer-v1\WEB-INF\web.xml
1 <web-app version="2.4" 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"> 2 <servlet> 3 <servlet-name>Ch3 Beer</servlet-name> 4 <servlet-class>com.example.web.BeerSelect</servlet-class> 5 </servlet> 6 7 <servlet-mapping> 8 <servlet-name>Ch3 Beer</servlet-name> 9 <url-pattern>/SelectBeer.do</url-pattern> 10 </servlet-mapping> 11 </web-app>
用户填写了表单,点击submit 浏览器生成了以下的请求URL /Beer-v1/SelectBeer.do
容器搜索DD(部署描述文件) 找到<url-pattern>与/SelectBeer.do匹配的一个<servlet-mapping>
容器看到对应这个<url-pattern>的<servlet-name>是Ch3 Beer (这并不是是实际的servlet类文件的名字
Ch3 Beer是servlet名 而不是servlet类的名字)
对容器来说 servlet只是一个在DD中按<servlet>命名的东西 servlet名只在DD中使用 以便DD的其他部分
建立servlet的映射
容器查找<servlet-name>为Ch3 Beer的<servlet>标记
根据<servlet>标记中的<servlet-class> 容器可以知道由哪个servlet类负责处理这个请求 如果这个servlet
还没有初始化 就会加载类 并初始化
容器开始一个新线程来处理这个请求 并把请求传递给线程(传递给servlet的service()方法)
容器吧响应通过WEB服务器发回给客户
servlet是一个控制器
\webapps\Beer-v1\WEB-INF\classes\com\example\web\BeerSelect.class
1 package com.example.web; 2 import javax.servlet.RequestDispatcher; 3 import javax.servlet.ServletException; 4 import javax.servlet.http.HttpServlet; 5 import javax.servlet.http.HttpServletRequest; 6 import javax.servlet.http.HttpServletResponse; 7 import java.io.IOException; 8 import java.io.PrintWriter; 9 import java.util.Iterator; 10 import java.util.List; 11 // 12 import com.example.model.*; 13 14 /** 15 * Created by Melody on 2015/10/29. 16 */ 17 public class BeerSelect extends HttpServlet 18 { 19 public void doPost(HttpServletRequest request, 20 HttpServletResponse response) 21 throws IOException, ServletException 22 { 23 //这个方法来自ServletResponse接口 24 //02response.setContentType("text/html"); 25 //02PrintWriter out = response.getWriter(); 26 //02out.print("Beer Selection Advice<br/>"); 27 这个方法来自ServletResponse接口 注意 这个参数要与HTML<select> 标记中的name属性相匹配 28 String c = request.getParameter("color");//这个color是form表单里面的<select name="color"> 29 //String[] cArrays = request.getParameters("color");这是接受一个数组(一个参数有多个值) 30 //01 out.print("<br/>Got beet color " + c); 31 32 BeerExpert be = new BeerExpert(); 33 List result = be.getBrands(c); 34 35 //为请求对象增加一个属性 供jsp使用 注意 JSP要寻找style 36 request.setAttribute("style", "result"); 37 38 //为JSP实例化一个请求分派器 39 RequestDispatcher view = request.getRequestDispatcher("result.jsp"); 40 41 //使用请求分配器要求容器准备好JSP 并向JSP发送请求和响应 42 view.forward(request, response); 43 44 //02Iterator it = result.iterator(); 45 //02while (it.hasNext()) 46 //02{ 47 //02 out.print("<br>try: " + it.next()); 48 //02} 49 } 50 }
\webapps\Beer-v1\WEB-INF\classes\com\example\model\BeerExpert.class
model层
1 package com.example.model; 2 import java.util.*; 3 //可以看到不用框架 这就是一个很普通的java类 4 public class BeerExpert 5 { 6 public List getBrands(String color) 7 { 8 List brands = new ArrayList<>(); 9 if (color.equals("amber")) 10 { 11 brands.add("Jack Amber"); 12 brands.add("Red Moose"); 13 } 14 else 15 { 16 brands.add("Jail Pale Ale"); 17 brands.add("Gout Stout"); 18 } 19 return brands; 20 } 21 }
\webapps\Beer-v1\result.jsp
这是view层
<%@ page import = "java.util.*" %> <html> <body> <h1 align = "center">Beer Recommendations JSP</h1> <% List styles = (List) request.getAttribute("styles"); Iterator it = styles.iterator(); while (it.hasNext()) { out.print("<br/>try: " + it.hasNext()); } %> </body> </html>
构建和测试模型类
模型是指应用的后台 不能把模型限制为只能由一个web应用使用 所以它应当有自己的工具包
模型都不用包括tomcat的类 模型就像一个专家 专家返回一个回答给 servlet吧这个回答增加到请求对象
servlet把请求对象转发给JSP JSP从请求对象中得到回答 JSP为容器生成一个页面 容器返回这个页面
servlet要做 吧model的回答增加到请求对象 以便JSP访问
要求容器吧请求发给"result.jsp"
模型的要求
包应当是com.example.model
其目录结构应该为/WEB-INF/classes/com/example/model
get get get