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/
分享到:
相关推荐
Beginning Java EE 5 javaEE7入门 原版英文,绝对好用
JSP快速入门教程 6 实例:hello.jsp ... Servlet,几乎所有介绍JSP的书和课程都包含Servlet,因为JSP实际上指的是Java Web开发。用Servlet主要是控制器。 JDBC,对数据库的访问。 JavaBean(Java类)
入门前选薄书,入门后选厚书 第1章 web应用开发简介 1 第2章 java ee运行及开发环境 15 第3章 jsp和servlet 33 第4章 sql与jdbc 64 第5章 struts 2框架基础 80 第6章 struts 2高级应用 110 第7章 ...
2、java ee (j2ee)web开发 3、java me (j2me)手机开发 java se课程介绍 java面向对象编程(基础) java图开界面开发 java数据库编程 java文件io流编程 java网络编程 java多线程编程 java ee基础1 java面向对象编程--...
入门前选薄书,入门后选厚书 第1章 web应用开发简介 1 第2章 java ee运行及开发环境 15 第3章 jsp和servlet 33 第4章 sql与jdbc 64 第5章 struts 2框架基础 80 第6章 struts 2高级应用 110 第7章 ...
中文名: 经典Java EE企业应用实战--基于WebLogic/JBoss的JSF+EJB 3+JPA整合开发 原名: 经典Java EE企业应用实战--基于WebLogic/JBoss的JSF+EJB 3+JPA整合开发 作者: 李刚 资源格式: PDF 版本: 第一版 出版社: 电子...
入门前选薄书,入门后选厚书 第1章 web应用开发简介 1 第2章 java ee运行及开发环境 15 第3章 jsp和servlet 33 第4章 sql与jdbc 64 第5章 struts 2框架基础 80 第6章 struts 2高级应用 110 第7章 ...
入门前选薄书,入门后选厚书 第1章 web应用开发简介 1 第2章 java ee运行及开发环境 15 第3章 jsp和servlet 33 第4章 sql与jdbc 64 第5章 struts 2框架基础 80 第6章 struts 2高级应用 110 第7章 ...
入门前选薄书,入门后选厚书 因文件长度,分5部分 第1章 web应用开发简介 1 第2章 java ee运行及开发环境 15 第3章 jsp和servlet 33 第4章 sql与jdbc 64 第5章 struts 2框架基础 80 第6章 struts 2高级...
Java EE Servlet 3.0 HttpSevletRequest.login()和logout()定义了安全性,该安全性由应用服务器(在本例中为。 创建用户和角色实体,并将查询字符串放入Wildfly配置文件中。 登录的用户可以访问UserDetail和...
第四讲 1、对Servlet的理解 Servlet是一种Java类。 Servlet能够完成与JSP相同的功能。能够接收用户的请求,能够调用功能类的方法,... Servlet和JSP同属于Java EE中Web层组件。 2、如何编写一个Servlet *******
课程首先介绍了Java Web的基础知识,其中包括Java EE技术概述、开发环境搭建、Servlet技术、JSP技术、JDBC技术;然后讨论了Java Web项目中的MVC设计模式,重点介绍了企业开发中的分层架构设计。课程最后安排了一个8个...
Java的体系分为Java SE、Java EE和Java ME(JDK 5.0以前分别叫J2SE、J2EE和J2ME),Java的敲门砖就是Java SE了,也就是你要入门学习的内容,不论你日后是选择哪个体系领域作为发展方向,你都得从Java SE起步。...
本书是讲解 MyEclipse 6 开发 Java EE 企业应用的入门图书。该书不但讲解了目前最 流行的 SSH(Spring、Struts、Hibernate)、JSF、JPA 的开发,同时还对 SOA 实现的基石 --Web Service 的开发进行了探讨。缺点就是...
Java EE servlet 477 21.7.4 选择Jython开发工具 483 21.8 使用Jython进行测试 483 21.9 嵌入Jython解释器 484 21.10 处理C-Python和Jython 之间的差异 487 21.11 本章小结 488 21.12 习题 488 第Ⅳ部分 附 录 附录A...
Java/JavaEE 学习笔记 作者在杰普学习时的学习笔记,是J2ee初学者必备手册,是大家学习J2EE开发的很好的参考笔记。 Java/JavaEE 学习笔记 内容目录: Unix 学习笔记..........7 一、Unix前言............7 二、...
入门将其添加到您的项目将此添加到您的依赖项: < dependency> < groupId>me.kisoft</ groupId> < artifactId>jesse</ artifactId> 设置您需要在web.xml中添加一些条目 < servlet> < servlet>{Servlet Name}</ ...
Java Web重难点,包含但不限于Servlet、JSP、Tomcat、Jetty ; Java EE开发流行框架,包含但不限于Spring、MyBatis、Hibernate、Vert.X; 计算机理论基础,包含但不限于计算机操作系统(Linux)、计算机网络、常见的...
而Spring Boot 是Spring 主推的基于“习惯优于配置”的原则,让你能够快速搭建应用的框架,从而使得Java EE 开发变得异常简单。 《JavaEE开发的颠覆者: Spring Boot实战》从Spring 基础、Spring MVC 基础讲起,从而...
而Spring Boot 是Spring 主推的基于“习惯优于配置”的原则,让你能够快速搭建应用的框架,从而使得Java EE 开发变得异常简单。 《JavaEE开发的颠覆者: Spring Boot实战》从Spring 基础、Spring MVC 基础讲起,从而...