你的位置:首页 > Java教程

[Java教程]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.

 1 <web-app version="2.4" ="http://java.sun.com/ ="http://www.w3.org/2001/ xsi:schemaLocation="http://java.sun.com/> 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 HttpServlet18 {19   public void doPost(HttpServletRequest request,20             HttpServletResponse response)21             throws IOException, ServletException22   {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要寻找style36     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     else15     {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