Java Servlet(server Applet)是运行在web服务器或应用服务器上的程序,它是作为来自web浏览器或其他HTTP客户端的请求和HTTP服务器上的数据库或应用程序之间的中间层。

Servlet容器必须要部署到Servlet容器(Web服务器)才能运行,Tomcat就是这样一款Servlet容器。

Apache Tomcat是一款JavaServlet和Java Server Pages技术的开源软件实现,可以作为测试Servlet的独立服务器。

 

Servlet是如何运作的

比如:在浏览器地址输入“http://ip:port/web01/greeting”

① 浏览器依据ip,port建立与服务器之间的连接。

② 浏览器将请求数据打包(依据http协议)。

③ 浏览器发送请求。

④ 服务器解析请求数据包,将解析的结果写入到request对象上,同时,服务器还会创建一个response对象。

⑤ 服务器依据请求资源路径(/web/greeting)找到对应的Servlet类名。接下来要创建Servlet对象。

⑥ 服务器调用Servlet的service方法,会将事先创建好的request,response对象作为参数传递进来。所以,可以通过request         对象获取获取请求数据,也可以通过response对象输出处理结果。

⑦ 服务器通过response对象获得处理结果,然后将处理结果打包,发送给浏览器。

⑧ 浏览器解析服务器返回的处理结果,然后生成相应的界面。

    http://localhost:8080/web01/greeting?name=lbj

 

常见问题:

① 404

含义:服务器依据请求地址没有找到对应的资源

错误原因:请求地址写错、没有部署。

② 500

含义:系统错误

错误原因:程序代码不严谨。

③ 405

含义:找不到处理方法

错误原因:service方法不符合规范。

 

Servlet生命周期

什么是Servlet的生命周期?

Servlet容器创建Servlet对象,为其分配资源,调用其方法处理请求,以及销毁该对象的整个过程。

生命周期分成四个阶段:

① 实例化

Servlet容器调用Servlet的构造器,创建一个Servlet对象。

② 初始化

容器在创建好Servlet对象之后,会立即调用该对象的init方法。

③ 就绪(调用)

容器收到请求后调用Servlet对象的service方法来处理请求,service方法再派遣运行与请求相对应的doGet(),doPost()方法来处理用户请求。

④ 销毁

容器在删除servlet对象之前,会调用对象的destroy方法。

其中,①②④在整个生命周期只会被执行一次。

 

Servlet实例

Servlet 是服务 HTTP 请求并实现 javax.servlet.Servlet 接口的 Java 类。Web 应用程序开发人员通常编写 Servlet 来扩展 javax.servlet.http.HttpServlet,并实现 Servlet 接口的抽象类专门用来处理 HTTP 请求

HelloWorld示例代码

// 扩展 HttpServlet 类
public class HelloWorld extends HttpServlet {
 
  private String message;

  public void init() throws ServletException
  {
      // 执行必需的初始化
      message = "Hello World";
  }

  public void doGet(HttpServletRequest request,
                    HttpServletResponse response)
            throws ServletException, IOException
  {
      // 设置响应内容类型
      response.setContentType("text/html");

      // 实际的逻辑是在这里
      PrintWriter out = response.getWriter();
      out.println("<h1>" + message + "</h1>");
  }
  
  public void destroy()
  {
      // 什么也不做
  }
}

 

Servlet部署

web.xml文件中创建以下条目。

<web-app>      
    <servlet>
        <servlet-name>HelloWorld</servlet-name>
        <servlet-class>HelloWorld</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>HelloWorld</servlet-name>
        <url-pattern>/HelloWorld</url-pattern>
    </servlet-mapping>
</web-app>  

 

启动 tomcat 服务器,最后在浏览器的地址栏中输入 http://localhost:8080/HelloWorld

 

Servlet表单数据

很多情况下,需要传递一些信息,从浏览器到 Web 服务器,最终到后台程序。浏览器使用两种方法可将这些信息传递到 Web 服务器,分别为 GET 方法和 POST 方法。

① get方法

GET 方法向页面请求发送已编码的用户信息。页面和已编码的信息中间用 ? 字符分隔,如下所示:

http://www.test.com/hello?key1=value1&key2=value2

GET 方法是默认的从浏览器向 Web 服务器传递信息的方法,它会产生一个很长的字符串,出现在浏览器的地址栏中。如果您要向服务器传递的是密码或其他的敏感信息,请不要使用 GET 方法。GET 方法有大小限制:请求字符串中最多只能有 1024 个字符。

这些信息使用 QUERY_STRING 头传递,并可以通过 QUERY_STRING 环境变量访问,Servlet 使用 doGet() 方法处理这种类型的请求。

② post方法

另一个向后台程序传递信息的比较可靠的方法是 POST 方法。POST 方法打包信息的方式与 GET 方法基本相同,但是 POST 方法不是把信息作为 URL 中 ? 字符后的文本字符串进行发送,而是把这些信息作为一个单独的消息。消息以标准输出的形式传到后台程序,您可以解析和使用这些标准输出。Servlet 使用 doPost() 方法处理这种类型的请求。

 

使用Servlet读取表单数据

Servlet 处理表单数据,这些数据会根据不同的情况使用不同的方法自动解析:

getParameter():您可以调用 request.getParameter() 方法来获取表单参数的值。

String param = request.getParameter(String paramName);

getParameterValues():如果参数出现一次以上,则调用该方法,并返回多个值,例如复选框。

String[] values = request.getParameterValues(paramValue);

getParameterNames():将获取所有form表单中name属性为username的值.该方法返回一个数组.遍历数组就可得到value值.

String[] names = request.getParameterValues("username")

请求资源路径

 

http://ip:port 后面的就是请求资源路径。

http://localhost:8080/appName/xxx;    appName可以是包名也可以是项目名。

在servlet类上运行就没有后缀,前面是包名。

在HTML和JSP页面上运行就有后缀(.html或.jsp),前面是项目名。

Web服务器对请求资源路径的处理过程:

①浏览器依据ip和port建立与Servlet容器之间的连接(通过配置Tomcat),然后将请求资源路径发送给容器。

②容器与产生应用/appName找到应用所在的文件夹,容器会默认请求的是一个Servlet,查询web.xml文件中所有的Servlet配       置,看是否有匹配的Servlet。

 

Servlet匹配规则

① 精确匹配

<url-pattern>/test.html</url-pattern>

尽管应用中有test.html这个具体的页面,也会去执行该<url-pattern>对应的Servlet,而不是具体的test.html页面。

 

② 模糊查询的通配符匹配

使用“*”来匹配0个或多个字符。

 

<url-pattern>/*</url-pattern>

输入任何不同的URL地址都将匹配成功。

 

③后缀匹配

不能使用斜杠开头,使用“*.”开头的任意多个字符。

<url-pattern>*.do</url-pattern>

会匹配以“.do”为后缀的所有请求。

通过后缀匹配可实现将多个请求交给一个Servlet处理。

 

Servlet网页重定向

当文档移动到新的位置,我们需要向客户端发送这个新位置时,我们需要用到网页重定向。当然,也可能是为了负载均衡,或者只是为了简单的随机,这些情况都有可能用到网页重定向。

什么是重定向:

服务器通知浏览器向一个地址发送请求。服务器可以向浏览器发送一个302状态码及一个Location消息头(包含重定向的地址),浏览器收到后立即向重定向地址发送请求。

重定向请求到另一个网页的最简单的方式是使用 response 对象的 sendRedirect() 方法。

response.sendRedirect(String url);

 

重定向的特点:

①重定向之后,浏览器地址栏的地址会改变。

②重定向之后,容器会先清空response对象缓存数据。

 

Servlet上下文

Servlet引擎为每一个WEB应用程序都创建了一个对应的ServletContext对象,ServletContext对象包含在ServletConfig对象中,调用 ServletConfig.getServletContext 方法可以返回该对象的引用。                                                                                由于一个WEB应用程序中的所有Servlet都共享同一个ServletContext对象,所以ServletContext对象被称为application对象。

特点:   

唯一性:一个WEB应用对应一个Servlet,只要容器不关闭,应用没被卸载,Servlet上下文就一直存在。

Servlet上下文绑定的数据可以被整个应用上的所有组件共享,并且一直可以访问。

应用:

①使用setAttribute 绑定数据

②使用removeAttribute 移除绑定数据

③使用getAttribute 获取绑定数据

例如:记录访问网站的总人数

当计数需要基于某一个特定的数字开始时,可以使用上下文配置参数,储存在web.xml中,所以当应用程序启动时,就可以读取这个初始值,再实现计数。

web.xml文件中:

<context-param>
        <param-name>count</param-name>
        <param-value> 0 </param-value>
<context-param>

 

Servlet中:

public void service(){
    PrintWriter out = response.getWriter();
    ServletContext context = getServletContext();
    Object count = context.getAttribute("count");
if(count!=null){   
        context.setAttribute("count",Integer.parseInt(count.toString());
    }else if(count==null){    
        context.setAttribute("count",context.getInitParameter("count");
    }
        out.println("总浏览量:"+context.getAttribute("count"));
  }
}

 

posted on 2018-05-18 23:10  FuYingju  阅读(56)  评论(0编辑  收藏  举报