Servlet Learner01

一个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

 

posted @ 2015-10-30 14:55  taojiatao  阅读(230)  评论(0编辑  收藏  举报