Servlet3两个特性演示

Servlet3两个特性演示

两个特性分别为:

  1. 直接访问JAR包内的资源
  2. 使用@WebServlet配置Servlet

本文仅以一个完整而简单的例子来演示这两个特性,更深入的东西还要自己找其他资料学习。

项目结构

servlet-parent
    │  pom.xml
    │
    ├─servlet-login
    │  │  pom.xml
    │  │
    │  └─src
    │      ├─main
    │      │  ├─java
    │      │  │  └─com
    │      │  │      └─github
    │      │  │          └─abel533
    │      │  │              └─login
    │      │  │                  └─servlet
    │      │  │                          LoginServlet.java
    │      │  │
    │      │  └─resources
    │      │      └─META-INF
    │      │          └─resources
    │      │              │  test.jsp
    │      │              │
    │      │              ├─static
    │      │              │  ├─js
    │      │              │  │      login.js
    │      │              │  │
    │      │              │  └─style
    │      │              │          login.css
    │      │              │
    │      │              └─WEB-INF
    │      │                  └─jsp
    │      │                          login.jsp
    │      │
    │      └─test
    │          └─java
    ├─servlet-main
    │  │  pom.xml
    │  │
    │  └─src
    │      ├─main
    │      │  ├─java
    │      │  ├─resources
    │      │  └─webapp
    │      │      └─WEB-INF
    │      │          │  web.xml
    │      │          │
    │      │          └─jsp
    │      │                  main.jsp
    │      │
    │      └─test
    │          └─java
    └─src
        ├─main
        │  ├─java
        │  └─resources
        └─test
            └─java

项目结构不算很复杂,使用了Maven子项目。

  • servlet-parent是父项目,pom.xml包含了一些通用的简单的jar包。

  • servlet-login项目包含了jsp,js,css和servlet,pom中配置的类型为jar,最终的结果就是打成了一个jar包。

  • servlet-main项目中有web.xml和main.jsp,还引用了servlet-login项目

这里分模块创建的目的是为了让不同的模块可以独立开发和使用,都是一个单独的jar包,引入项目后就能通过地址访问相应的内容。

这个例子就是为了演示而写,所以只适合用来学习参考!

直接访问JAR包内的资源

在Servlet3协议规范中,包含在JAR文件/META-INF/resources/路径下的资源可以直接访问。

所以你可以注意servlet-login项目,你会发现在src/main/resources下面有META-INF/resources目录,该目录下面的文件又完全按照web资源目录进行创建。

test.jsp是一个可以直接在浏览器中访问的页面,static中包含了可以直接访问的js和css,在WEB-INF中包含了需要安全访问(不能直接通过浏览器地址访问)的资源文件,这里主要是举例子,所以用的login.jsp。

按照上面这种结构放置的资源,可以像在webapp目录中的资源一样直接使用。

例如login.jsp中:

<%@ page language="java" pageEncoding="UTF-8" %>
<!DOCTYPE HTML>
<html lang="zh">
    <meta content="text/html; charset=UTF-8" http-equiv="Content-Type">
    <title>登录</title>
    <script type="text/javascript" src="${pageContext.request.contextPath}/static/js/login.js"></script>
    <link href="${pageContext.request.contextPath}/static/style/login.css" rel="stylesheet" type="text/css">
</head>
<body>
<h2>登录</h2>
<h3 class="red">${message}</h3>
<form action="${pageContext.request.contextPath}/login" method="post">
    姓名:<input type="text" name="username"/><br/>
    密码:<input type="password" name="password"/><br/>
    <input type="submit" value="登录"/>
</form>
</body>
</html>

注意看这里引用js和css,完全和在webapp目录中的写法一样。

WEB-INF/jsp/login.jsp的用法也一样,下面讲Servlet会看到。

使用@WebServlet配置Servlet

src/main/java中的包里有个LoginServlet类:

/** * @author isea533 * @since 2015-09-16 22:32 */
@WebServlet("/login")
public class LoginServlet extends HttpServlet {

    private String successJsp = "WEB-INF/jsp/main.jsp";
    private String loginJsp = "WEB-INF/jsp/login.jsp";

    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        req.getRequestDispatcher(loginJsp).forward(req, resp);
    }

    protected void doPost(HttpServletRequest req, HttpServletResponse resp) 
            throws ServletException, IOException {
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        System.out.println("username:"+username+",password:"+password);
        resp.setCharacterEncoding("UTF-8");
        if(username.equals("admin") && password.equals("123456")){
            req.setAttribute("message", "欢迎您:" + username);
            req.getRequestDispatcher(successJsp).forward(req, resp);
        } else {
            req.setAttribute("message", "用户名或密码错误!");
            req.getRequestDispatcher(loginJsp).forward(req, resp);
        }
    }

}

首先这里通过@WebServlet("/login")定义了servlet的映射为/login,可以直接通过该地址访问。

另外代码中通过req.getRequestDispatcher(loginJsp).forward(req, resp);来访问WEB-INF下的资源。

servlet-main

在这个项目中,pom中配置的类型为war,引用了servlet-login项目。

web.xml中基本上没什么配置:

<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
    <display-name>Archetype Created Web Application</display-name>

    <welcome-file-list>
        <welcome-file>/login</welcome-file>
    </welcome-file-list>

</web-app>

在浏览器中访问

将servlet-main打包后放到tomcat下运行,或者在IDE中添加到tomcat下运行。

在浏览器地址栏中输入基础地址/login进行访问,可以看到效果和写在webapp中的一样。

源码下载

如果你对上面的内容不是很明白,想要自己试试,可以直接下载源码导入IDE中查看。

源码地址:http://pan.baidu.com/s/1pJEGEFL

WAR包下载

如果想在tomcat中看看效果,也可以直接下载war包。

war包地址:http://pan.baidu.com/s/1o6lC5Rk

war包中的目录结构:

├─META-INF
│      MANIFEST.MF
│
└─WEB-INF
    │  web.xml
    │
    ├─classes
    ├─jsp
    │      main.jsp
    │
    └─lib
            javax.annotation-api-1.2.jar
            javax.servlet.jsp.jstl-api-1.2.1.jar
            javax.transaction-api-1.2.jar
            javax.websocket-api-1.0.jar
            javax.ws.rs-api-2.0.jar
            servlet3-login-1.0-SNAPSHOT.jar

最后

虽然这些特性都是几年前的东西了,但是项目中更多用的Servlet2.x版本,一直没有真正使用过Servlet3,所以利用业余时间学学并且记录下来,方便以后使用的时候查看。同时也方便听说过但是从来没尝试过的朋友可以通过源码去真正了解。

你可能感兴趣的:(servlet,servlet3,webservlet)