[Java EE 7] Web Servlet 快速入门
程序员文章站
2022-04-26 11:41:55
...
Servlet 的规范是 JSR 340,完整的规范内容可以到这里下载。
Servlet 是放在 servlet 容器中的 Web 组件,可以生成动态内容。客户端通过请求/响应的方式来访问 Servlet。Servlet 容器负责管理 servlet 的生命周期,接收请求并发送响应,以及编码/解码等其它工作。
定义 servlet 需要使用到 @WebServlet 注释,并且需要继承 javax.servlet.http.HttpServlet 类。
下面是定义 servlet 的例子:
完整的类名就是默认的 servlet 名称,可以使用 annotation 的 name 属性来改变 servlet 的名称。同一个 servlet 也可以定义多个 URL:
@WebInitParam 注释可以用来定义初始化参数:
HttpServlet 接口使用 doxxx 方法来处理 HTTP GET、POST、PUT、DELETE、 HEAD、OPTIONS、 和 TRACE 请求。一般来说,程序员比较关注覆盖 doGet 和 doPost 方法,下面的例子演示了 servlet 如何处理 GET 请求:
在这段代码中:
Http cookies 也会被发送和获取。开发者的主要任务就是构建 HttpServletResponse。容器将会发送 Http 头和消息体到客户端。
下面的例子演示了如何使用 servlet 处理 HTTP GET 请求并返回一段简单的字符串到客户端:
请求参数可以用 GET 和 POST 的方式来传递。在 GET 请求中,参数是通过一对对拥有名称/值的字符串来进行传递,下面是一个简单的拥有请求参数的 URL 例子:
在 POST 请求中,请求参数的数据封装在请求体中。不管是通过 GET 还是通过 POST 传递的参数,都可以从 HttpServletRequest 中取得:
初始化参数,可以定义在 Servlet 上用来保存一些配置信息。像前面例子中的 @WebInitParam 就是用于为 servlet 配置初始化参数:
可以通过覆盖 javax.servlet.Servlet 接口中的 init、service 和 destroy 方法来控制 servlet 的生命周期。经典用法是在 init 中初始化数据库连接,在 destroy 中释放。
可以在 web 部署描述符(web.xml)中使用 servlet 和 servlet-mapping 节点来定义 servlet。
下面看看在 web.xml 中定义 AccountServlet 的例子:
使用 annotation 能处理大多数的配置,在这种情况下就不需要使用到 web.xml。但是,有的配置,比如 servlet 的排序,必须要通过 web.xml 才能完成。
如果在 web.xml 中 metadata-complete 的属性设置为 true,那么类中的 annotation 将会被忽略:
另外,如果同时配置了 web.xml 和 annotation,那么 web.xml 将会覆盖 annnotation。
Servlet 会被打包成 .war 文件的 web 应用。多个 servlet 可以同时打包在一起,它们共享同一个 servlet 上下文环境。ServletContext 提供了 servlet 的运行环境以及和容器进行通信的细节。
ServletContext 可以从 request 中获得:
Servlet 会传输名为 JSESSIONID 的 HTTP Cookie,用于客户端的 session 跟踪。这个 Cookie 可以设置为 HttpOnly,这意味着这个 Cookie 值不会暴露给客户端的脚本代码,这样可以防止某种类型的跨域脚本攻击:
ServletContext.getSessionCookieConfig 方法可以返回SessionCookieConfig 对象,它可以用来设置不同的 cookie 属性值。
HttpSession 接口可以用来操作 session 信息,下面的例子演示了如何创建一个新的 Session:
session.setAttribute 和 session.getAttribute 方法可以用来绑定对象到 session 和从 session 中获取绑定对象。
如果后续还需要对请求进行处理,Servlet 可以转发请求到另外的 servlet。可以用 RequestDispatcher 将请求转发到不同的资源,取得这个对象可以通过 HttpServletRequest.getRequestDispatcher 或 ServletContext.getRequestDispatcher。转发请求的时候可以接受相对路径,相对路径总是关联当前的应用程序上下文:
上面的例子中,bank 就是同一个上下文环境中的另一个 servlet。
ServletContext.getContext 可以在外部的上下文环境中取得 ServletContext,它可以在外部的上下文环境中取得 RequestDispatcher 并进行转发请求。
可以调用 HttpServletResponse.sendRedirect 来重定向 servlet 的响应到另外的资源。这个操作会发送一个临时的重定向响应给客户端,客户端会发送一个新的请求到指定的 URL。注意,在这种情况下,原始请求中的数据在新的 URL 中将不可用。重定向操作速度也会稍微慢一些,因为它会在客户端发起两次请求:
上面的例子演示了重定向到 http://example.com/SomeOtherServlet URL,重定向的 URL 可以拥有不同的主机和端口,可以是容器的相对或绝对路径。
除了使用 @WebServlet 和 web.xml 定义 servlet 之外,也可以使用 ServletContext.addServlet 通过编码的方式来定义 servlet。可以在 ServletContainerInitializer.onStartup 或 ServletContextListener.contextInitialized 方法中来进行这个操作。
ServletContainerInitializer.onStartup 方法将会在应用启动的时候调用。addServlet 方法将返回 ServletRegistration.Dynamic 类型,可以用来设置 URL mappings,设置安全角色,设置初始化参数或管理其它的一些配置项:
文章来源:http://www.aptusource.org/2014/03/java-ee-7-web-servlet/
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/
上一篇: 识别代码中的坏味道(二)
推荐阅读
-
JAVA WEB快速入门之从编写一个基于SpringBoot+Mybatis快速创建的REST API项目了解SpringBoot、SpringMVC REST API、Mybatis等相关知识
-
JAVA WEB快速入门之环境搭建
-
JAVA WEB快速入门之从编写一个基于SpringMVC框架的网站了解Maven、SpringMVC、SpringJDBC
-
JAVA WEB快速入门之通过一个简单的Spring项目了解Spring的核心(AOP、IOC)
-
JAVA WEB快速入门之从编写一个基于SpringBoot+Mybatis快速创建的REST API项目了解SpringBoot、SpringMVC REST API、Mybatis等相关知识
-
JAVA WEB快速入门之从编写一个基于SpringMVC框架的网站了解Maven、SpringMVC、SpringJDBC
-
JAVA WEB快速入门之环境搭建
-
[Java EE 7] JSF Facelets 快速入门
-
[Java EE 7] Servlet Filter 简介
-
[Java EE 7] Web Servlet 快速入门