`
cucaracha
  • 浏览: 141442 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
博客专栏
A8f3fa2f-18ce-3862-897a-5d2209197c90
Java NIO.2
浏览量:87920
7a076ba7-8ec8-3241-aa3c-67bb2f7856a2
Java EE 7 简明教...
浏览量:36713
社区版块
存档分类
最新评论

[Java EE 7] Web Servlet 快速入门

阅读更多
Servlet 的规范是 JSR 340,完整的规范内容可以到这里下载。

Servlet 是放在 servlet 容器中的 Web 组件,可以生成动态内容。客户端通过请求/响应的方式来访问 Servlet。Servlet 容器负责管理 servlet 的生命周期,接收请求并发送响应,以及编码/解码等其它工作。

定义 servlet 需要使用到 @WebServlet 注释,并且需要继承 javax.servlet.http.HttpServlet 类。

下面是定义 servlet 的例子:

@WebServlet("/account")
public class AccountServlet extends javax.servlet.http.HttpServlet {
  //. . .
}


完整的类名就是默认的 servlet 名称,可以使用 annotation 的 name 属性来改变 servlet 的名称。同一个 servlet 也可以定义多个 URL:

@WebServlet(urlPatterns={"/account", "/accountServlet"})
public class AccountServlet extends javax.servlet.http.HttpServlet {
  //. . .
}


@WebInitParam 注释可以用来定义初始化参数:

@WebServlet(urlPatterns="/account",
            initParams={
               @WebInitParam(name="type", value="checking")
                       }
           )
public class AccountServlet extends javax.servlet.http.HttpServlet {
       //..
}


HttpServlet 接口使用 doxxx 方法来处理 HTTP GET、POST、PUT、DELETE、 HEAD、OPTIONS、 和 TRACE 请求。一般来说,程序员比较关注覆盖 doGet 和 doPost 方法,下面的例子演示了 servlet 如何处理 GET 请求:

@WebServlet("/account")
public class AccountServlet 
  extends javax.servlet.http.HttpServlet {
  @Override
  protected void doGet(
        HttpServletRequest request, 
        HttpServletResponse response) {
    //. . .
  }
}


在这段代码中:

  •     HttpServletRequest 和 HttpServletResponse 分别对应 HTTP 中的请求和响应。
  •     请求参数;HTTP 头;路径中的信息,例如主机名、端口号、应用程序上下文;等很多有用的信息都可以从 HttpServletRequest 中取得。


Http cookies 也会被发送和获取。开发者的主要任务就是构建 HttpServletResponse。容器将会发送 Http 头和消息体到客户端。

下面的例子演示了如何使用 servlet 处理 HTTP GET 请求并返回一段简单的字符串到客户端:

protected void doGet(HttpServletRequest request, 
                     HttpServletResponse response) {
    try (PrintWriter out = response.getWriter()) {
        out.println("<html><head>");
        out.println("<title>MyServlet</title>");
        out.println("</head><body>");
        out.println("<h1>My First Servlet</h1>");
        //. . .
        out.println("</body></html>");
    } finally {
        //. . .
    }
}


请求参数可以用 GET 和 POST 的方式来传递。在 GET 请求中,参数是通过一对对拥有名称/值的字符串来进行传递,下面是一个简单的拥有请求参数的 URL 例子:

. . ./account?tx=10


在 POST 请求中,请求参数的数据封装在请求体中。不管是通过 GET 还是通过 POST 传递的参数,都可以从 HttpServletRequest 中取得:

protected void doGet(HttpServletRequest request, 
                     HttpServletResponse response) {
  String txValue = request.getParameter("tx");
  //. . .
}


初始化参数,可以定义在 Servlet 上用来保存一些配置信息。像前面例子中的 @WebInitParam 就是用于为 servlet 配置初始化参数:

String type = null;

@Override
public void init(ServletConfig config) throws ServletException {
  type = config.getInitParameter("type");
  //. . .
}


可以通过覆盖 javax.servlet.Servlet 接口中的 init、service 和 destroy 方法来控制 servlet 的生命周期。经典用法是在 init 中初始化数据库连接,在 destroy 中释放。

可以在 web 部署描述符(web.xml)中使用 servlet 和 servlet-mapping 节点来定义 servlet。

下面看看在 web.xml 中定义 AccountServlet 的例子:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.1" 
  xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
  http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
  <servlet>
    <servlet-name>AccountServlet</servlet-name>
    <servlet-class>org.sample.AccountServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>AccountServlet</servlet-name>
    <url-pattern>/account</url-pattern>
  </servlet-mapping>
</web-app>


使用 annotation 能处理大多数的配置,在这种情况下就不需要使用到 web.xml。但是,有的配置,比如 servlet 的排序,必须要通过 web.xml 才能完成。

如果在 web.xml 中  metadata-complete 的属性设置为 true,那么类中的 annotation 将会被忽略:

<web-app version="3.1" 
  xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
  http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
  metadata-complete="true">
  //. . .
</web-app>


另外,如果同时配置了 web.xml 和 annotation,那么 web.xml 将会覆盖 annnotation。

Servlet 会被打包成 .war 文件的 web 应用。多个 servlet 可以同时打包在一起,它们共享同一个 servlet 上下文环境。ServletContext 提供了 servlet 的运行环境以及和容器进行通信的细节。

ServletContext 可以从 request 中获得:

protected void doGet(HttpServletRequest request, 
                     HttpServletResponse response) {
  ServletContext context = request.getServletContext();
  //. . .
}


Servlet 会传输名为 JSESSIONID 的 HTTP Cookie,用于客户端的 session 跟踪。这个 Cookie 可以设置为 HttpOnly,这意味着这个 Cookie 值不会暴露给客户端的脚本代码,这样可以防止某种类型的跨域脚本攻击:

SessionCookieConfig config = request.getServletContext().getSessionCookieConfig();
config.setHttpOnly(true);


ServletContext.getSessionCookieConfig 方法可以返回SessionCookieConfig 对象,它可以用来设置不同的 cookie 属性值。

HttpSession 接口可以用来操作 session 信息,下面的例子演示了如何创建一个新的 Session:

protected void doGet(HttpServletRequest request, 
                     HttpServletResponse response) {
  HttpSession session = request.getSession(true);
  //. . .
}


session.setAttribute 和 session.getAttribute 方法可以用来绑定对象到 session 和从 session 中获取绑定对象。

如果后续还需要对请求进行处理,Servlet 可以转发请求到另外的 servlet。可以用 RequestDispatcher 将请求转发到不同的资源,取得这个对象可以通过 HttpServletRequest.getRequestDispatcher 或 ServletContext.getRequestDispatcher。转发请求的时候可以接受相对路径,相对路径总是关联当前的应用程序上下文:

protected void doGet(HttpServletRequest request, 
                     HttpServletResponse response) {
  request.getRequestDispatcher("bank").forward(request, response);
  //. . .
}


上面的例子中,bank 就是同一个上下文环境中的另一个 servlet。

ServletContext.getContext 可以在外部的上下文环境中取得 ServletContext,它可以在外部的上下文环境中取得 RequestDispatcher 并进行转发请求。

可以调用 HttpServletResponse.sendRedirect 来重定向 servlet 的响应到另外的资源。这个操作会发送一个临时的重定向响应给客户端,客户端会发送一个新的请求到指定的 URL。注意,在这种情况下,原始请求中的数据在新的 URL 中将不可用。重定向操作速度也会稍微慢一些,因为它会在客户端发起两次请求:

protected void doGet(HttpServletRequest request, 
                     HttpServletResponse response) {
  //. . .
  response.sendRedirect("http://example.com/SomeOtherServlet");
}


上面的例子演示了重定向到 http://example.com/SomeOtherServlet URL,重定向的 URL 可以拥有不同的主机和端口,可以是容器的相对或绝对路径。

除了使用 @WebServlet 和 web.xml 定义 servlet 之外,也可以使用 ServletContext.addServlet 通过编码的方式来定义 servlet。可以在  ServletContainerInitializer.onStartup 或 ServletContextListener.contextInitialized 方法中来进行这个操作。

ServletContainerInitializer.onStartup 方法将会在应用启动的时候调用。addServlet 方法将返回 ServletRegistration.Dynamic 类型,可以用来设置 URL mappings,设置安全角色,设置初始化参数或管理其它的一些配置项:

public class MyInitializer implements ServletContainerInitializer {
  @Override
  public void onStartup (Set<Class<?>> clazz, ServletContext context) {
    ServletRegistration.Dynamic reg = 
        context.addServlet("MyServlet", "org.example.MyServlet");
    reg.addMapping("/myServlet");  
  }
}


文章来源:http://www.aptusource.org/2014/03/java-ee-7-web-servlet/
0
0
分享到:
评论

相关推荐

    Beginning Java EE 7 javaEE7入门

    文件提到的Java EE 7入门,意味着这本教程或书籍将会为初学者提供一个关于Java EE 7的基础框架、技术和组件的介绍,帮助新手理解如何使用Java EE 7进行企业级应用的开发。 2. Java EE 7核心组件 文档中提到的...

    Java Web从入门到精通光盘源码1-15

    2. **Java EE**:Java企业版(Java EE)是Java Web开发的平台,包含了一系列API和服务,如Java Servlet、JSP、JSTL、EJB(Enterprise JavaBeans)、JPA(Java Persistence API)等,用于构建分布式、多层的企业级...

    Java Web快速入门——全十讲

    ### Java Web快速入门——全十讲 #### 一、Java与Web开发的融合:JavaEE标准框架 在探讨Java Web开发之前,我们首先要理解Java在Web领域的定位。Java不仅仅是一种编程语言,它还是一套完整的生态系统,适用于各种...

    Java_Web快速入门——全十讲

    ### Java Web 快速入门全十讲知识点梳理 #### 第一讲:Java Web 概念与环境搭建 ##### 1. Java 与 Java Web 的关系 - **Java 的三大平台**: - Java SE(Standard Edition):标准版,适用于桌面应用软件。 - ...

    Servlet技术入门 Servlet技术入门Servlet技术入门

    Servlet 技术是Java EE平台中的核心组成部分,用于构建服务器端应用程序,特别是在Web开发中扮演着重要角色。Servlet 是一种规范,它定义了如何编写能够处理客户端请求并返回响应的Java类。这些请求通常基于HTTP协议...

    Java Web从入门到精通_PPT

    这份"Java Web从入门到精通_PPT"很可能是提供了一个系统化的学习路径,旨在帮助初学者逐步掌握这一领域的核心概念和技术。以下是这个主题中可能包含的一些关键知识点: 1. **Java基础**:学习Java Web前,首先需要...

    Java EE 7.zip

    Java EE 7,全称Java Platform, Enterprise Edition 7,是Java平台上用于构建企业级Web应用的标准和框架集合。这个版本在2013年发布,带来了许多改进和新特性,旨在提高开发效率,增强可扩展性和灵活性。下面将详细...

    java源码 java ee基础入门实例 2018127

    本教程基于2018年的版本,旨在帮助初学者入门Java EE的基础知识,通过实例学习来加深理解。 1. **Java源码**: Java源码是程序设计的基础,它是由程序员编写的用Java语言书写的代码。在Java EE环境中,源码通常...

    The Java EE 5Tutorial

    5. **Servlet和JSP**:虽然Java EE 5引入了JSF,但Servlet和JSP仍然是构建Web应用的重要组成部分。Servlet是服务器端的小型Java程序,处理HTTP请求,而JSP则用于创建动态HTML页面,将业务逻辑和视图层分离。 6. **...

    01-servlet开发入门.zip

    3. 使用@WebServlet注解,从Java EE 6开始,可以直接在Servlet类上添加注解,简化配置。 在`web.xml`文件中,你可以配置Servlet的URL映射,例如: ```xml &lt;servlet&gt; &lt;servlet-name&gt;MyServlet&lt;/servlet-name&gt; ...

    Java EE 5 入门 PPT

    本PPT旨在为初学者提供一个全面的入门指南,帮助理解Java EE 5的核心概念和技术。 1. **Java EE概述** - Java EE 5作为Java平台的企业版本,主要针对服务器端应用开发,它扩展了Java SE(Standard Edition)的功能...

    servlet入门servlet入门

    它作为J2EE(现称Java EE)架构的重要组成部分,是构建动态Web应用程序的核心技术之一。在Web服务器与Web浏览器之间,Servlet位于J2EE Web容器内,充当着中间件的角色,负责接收来自浏览器的HTTP请求,处理业务逻辑...

    Java_Servlet入门教程

    以上就是关于Java Servlet入门教程的相关知识点,从基础的Servlet工作原理到高级的应用场景,都进行了详细的说明。通过这些知识点的学习,相信可以帮助开发者有效地利用Servlet技术开发出功能强大、效率高的Web应用...

    《Java Web开发教程——入门与提高篇(JSP+Servlet)》附赠电子资料——框架基础及实例

    JSF 是Java EE标准的一部分,是一种用于构建企业级Java Web应用程序的组件框架。它的主要特点是提供了一套易于使用的UI组件库,以及一套强大的生命周期管理机制。JSF的关键特性包括: - **组件模型**:JSF使用基于...

    JAVA WEB编程从入门到实践2

    在这个"JAVA WEB编程从入门到实践2"的学习资源中,我们可以深入探讨以下几个关键知识点: 1. **Java基础知识**:作为Java Web编程的基础,首先需要掌握Java语言的基本语法、面向对象编程概念以及异常处理。这是理解...

    The Java EE 6 Tutorial

    2. **Web Profile**:这是Java EE 6的一个重要组成部分,它包含了一个轻量级的子集,专为Web应用设计,包括Servlet、JSP、JSF、JPA等,适用于资源有限的环境。 3. **RESTful Web Services**:通过JSR 311 JAX-RS...

    Java EE技术基础

    Java EE技术基础是学习企业级应用开发的重要入门知识,涵盖了许多核心组件和技术,如JDBC、JSP、Servlet、Hibernate、Struts和Spring等。 首先,Java EE规范旨在解决企业计算中遇到的关键问题,包括事务管理、安全...

    学习servlet最全的材料。适合初学者入门

    Servlet是Java EE(现在称为Jakarta EE)平台中的一个重要组件,它主要用于构建动态Web应用程序。Servlet是一种Java类,它响应来自客户端(通常是Web浏览器)的请求,并生成动态内容。本文将深入讲解Servlet的基本...

Global site tag (gtag.js) - Google Analytics