Servlet3.0注解技术

PS: 自从专注前端以来,已经好久没有碰 java了,现在重新复习来感受一下 java,不管来得及来不及,学无止境,能够拿来做项目才是硬道理

因为我是非常喜欢注解这个东西的,这是个好东西,在学习 angular2+ 的时候,里面就新增了注解 annotation 的方法,现在 servlet3.0 出来以后多了注解,这是我非常喜欢的,也是我为什么写这篇文章的缘由之一吧

Servlet 各版本对应的环境

Servlet Spec JSP Spec EL Spec WebSocket Spec JASPIC Spec Apache Tomcat version Actual release revision Supported Java Versions
4.0 TBD (2.4?) TBD (3.1?) TBD (1.2?) 1.1 9.0.X 9.0.0.M15 (alpha) 8 and later
3.1 2.3 3.0 1.1 1.1 8.5.X 8.5.9 7 and later
3.1 2.3 3.0 1.1 N/A 8.0.X (superseded) 8.0.39 (superseded) 7 and later
3.0 2.2 2.2 1.1 N/A 7.0.X 7.0.7.3 6 and later (7 and later for WebSocket)
2.5 2.1 2.1 N/A N/A 6.0.X 6.0.4.8 5 and later

@WebServlet

/** LoginServlet.java **/
package ren.draven.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/login")
public class LoginServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
//      super.doPost(req, res); //下面有跳转,这一行得注释掉,不然启动 tomcat 会报错
        System.out.println("----------doPost----------");

        String userName = req.getParameter("userName");
        String userPwd = req.getParameter("userPwd");

        System.out.println(userName);
        System.out.println(userPwd);

        if ("admin".equals(userName) && "admin123".equals(userPwd)) {
            req.setAttribute("userName", userName);
            req.getRequestDispatcher("/index.jsp").forward(req, res);
        } else {
            req.getRequestDispatcher("/fail.jsp").forward(req, res);
        }
    }

}

<!-- login.jsp -->
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>login</title>
</head>
<body>
    <form action="login" method="post">
        <h1>用户登录</h1>
        账号:<input type="text" name="userName"><br>
        密码:<input type="password" name="userPwd"><br>
        <input type="submit" value="登录">
    </form>
</body>
</html>
<!-- index.jsp -->
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    <h1>恭喜您,${userName} 登录成功</h1>
</body>
</html>
<!-- fail.jsp -->
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    <h1>账号或密码错误,登录失败</h1>
</body>
</html>

如果新建 web 项目的时候,生成了 web.xml 配置文件,如果想要取消注解的功能的话,可以在 web-app 标签中添加属性 metadata-complete="true"

以前的 Servlet 在 web.xml 中的配置

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
    id="WebApp_ID" version="3.1">
    
    <display-name>testdemo</display-name>
    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
    </welcome-file-list>

    <servlet>
        <servlet-name>TestServlet</servlet-name>
        <servlet-class>ren.draven.servlet.TestServlet</servlet-class>
        <init-param>
            <param-name>nickname</param-name>
            <param-value>小凯</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>TestServlet</servlet-name>
        <url-pattern>/test</url-pattern>
    </servlet-mapping> 
    <servlet-mapping>
        <servlet-name>TestServlet</servlet-name>
        <url-pattern>/testServlet</url-pattern>
    </servlet-mapping> 
</web-app>

@WebInitParam

对比 servlet3.0 中的注解方式,省略 web.xml 文件的配置

/* TestServlet.java */
package ren.draven.servlet;

import java.io.IOException;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/*
 * <servlet>
        <servlet-name>TestServlet</servlet-name>
        <servlet-class>ren.draven.servlet.TestServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>TestServlet</servlet-name>
        <url-pattern>/test</url-pattern>
    </servlet-mapping>
    
    name === <servlet-name>
    urlPatterns === <url-pattern>
    urlPatterns 和 value 等同,只能二选一
    
    loadOnStartup === <load-on-startup></load-on-startup>
    
    @WebInitParam(name="",value="") === 
        <init-param>
            <param-name>nickname</param-name>
            <param-value>小凯</param-value>
        </init-param>
 */

@WebServlet(name = "TestServlet", urlPatterns = { "/test", "/testServlet" }, loadOnStartup = 1,initParams= {@WebInitParam(name="nickname",value="小凯")})
public class TestServlet extends HttpServlet {

    @Override
    public void init() throws ServletException {
        ServletConfig config = this.getServletConfig();
        String name = config.getInitParameter("nickname");
        System.out.println("-------init-----: " + name);
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("------doGet--------");
    }

}

@WebFilter

/* UTFFilter */
package ren.draven.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;

/**
 * <filter>
    <filter-name>UTFFilter</filter-name>
    <filter-class>ren.draven.filter.UTFFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>UTFFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  
 * @author dravenxiaokai
 *
 *  filterName <==> <filter-name>
 *  urlPatterns="/*" <==> <url-pattern>/*</url-pattern>
 *  urlPatterns <==> value
 */

@WebFilter(filterName="UTFFilter",value= {"/*"},servletNames = {"LoginServlet"})
public class UTFFilter implements Filter{

    @Override
    public void destroy() {
        System.out.println("------销毁---------");
    }

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain filterChain)
            throws IOException, ServletException {
        // 设置字符编码集
        req.setCharacterEncoding("utf-8");
        filterChain.doFilter(req, res);
    }

    @Override
    public void init(FilterConfig arg0) throws ServletException {
        System.out.println("------初始化--------");
        
    }

}

登录验证

/** LoginServlet.java **/
package ren.draven.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

@WebServlet("/login")
public class LoginServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
        // super.doPost(req, res); //下面有跳转,这一行得注释掉,不然启动 tomcat 会报错
        System.out.println("----------doPost----------");

        String userName = req.getParameter("userName");
        String userPwd = req.getParameter("userPwd");

        System.out.println(userName);
        System.out.println(userPwd);

        if ("admin".equals(userName) && "admin123".equals(userPwd)) {
            // 登录成功,把账号保存到 session 中
            HttpSession session = req.getSession();
            session.setAttribute("user", userName);

            req.getRequestDispatcher("/index.jsp").forward(req, res);
        } else {
            req.getRequestDispatcher("/fail.jsp").forward(req, res);
        }
    }

}
/* LoginFilter.java */
package ren.draven.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

@WebFilter("/*")
public class LoginFilter implements Filter {

    @Override
    public void destroy() {
    }

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain filterChain)
            throws IOException, ServletException {
        // 获取 HttpServletRequest
        HttpServletRequest req2 = (HttpServletRequest) req;
        // 获取 session
        HttpSession session = req2.getSession();

        String user = (String) session.getAttribute("user");
        // 获取请求的地址
        String uri = req2.getRequestURI();
        System.out.println(uri);

        if (user != null) {
            filterChain.doFilter(req2, res);
        } else if (uri.contains("/login")) {
            filterChain.doFilter(req2, res);
        } else {
            req2.getRequestDispatcher("/login.jsp").forward(req, res);
        }
    }

    @Override
    public void init(FilterConfig arg0) throws ServletException {
    }
}

常规的 Listener

/* MyListener.java */
package ren.draven.listener;

import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

public class MyListener implements HttpSessionListener {

    @Override
    public void sessionCreated(HttpSessionEvent arg0) {
        System.out.println("------sessionCreated-------");
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent arg0) {
        System.out.println("-----sessionDestroyed------");
    }
}

/* web.xml */
  <listener>
    <listener-class>ren.draven.listener.MyListener</listener-class>
  </listener>

@WebListener

/* MySessionListener.java */
package ren.draven.listener;

import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;

@WebListener
public class MySessionListener implements HttpSessionAttributeListener {

    @Override
    public void attributeAdded(HttpSessionBindingEvent event) {
        System.out.println("key: " + event.getName() + " value: " + event.getValue());
        System.out.println("-----attributeAdded-------");
    }

    @Override
    public void attributeRemoved(HttpSessionBindingEvent event) {
        System.out.println("key: " + event.getName() + " value: " + event.getValue());
        System.out.println("------attributeRemoved-------");
    }

    @Override
    public void attributeReplaced(HttpSessionBindingEvent event) {
        System.out.println("key: " + event.getName() + " value: " + event.getValue());
        System.out.println("-------attributeReplaced------");
    }
}
/* index.jsp */
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>index.jsp</title>
</head>
<body>
    <%
        // 销毁
        session.invalidate();
    %>
</body>
</html>
/* add.jsp */
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>add.jsp</title>
</head>
<body>
    <%
        session.setAttribute("username", "小凯");
    %>
</body>
</html>
/* remove.jsp */
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>remove.jsp</title>
</head>
<body>
    <%
        session.setAttribute("username", "小凯");
        session.removeAttribute("username");
    %>
</body>
</html>
/* replace.jsp */
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>replace.jsp</title>
</head>
<body>
    <%
        session.setAttribute("username", "小凯");
        //session.removeAttribute("username");
        session.setAttribute("username", "draven");
    %>
</body>
</html>

Servlet3.0 中的上传

/* file.jsp */
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>上传文件</title>
</head>
<body>
    <form action="uploadFile" method="post" enctype="multipart/form-data">
        <input type="file" name="upfile">
        <input type="submit" value="上传">
    </form>
</body>
</html>
/* UploadFileServlet.java */
package ren.draven.servlet;

import java.io.IOException;
import java.util.UUID;

import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;

@WebServlet("/uploadFile")
@MultipartConfig
public class UploadFileServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
        // 获取文件部件 part
        Part part = req.getPart("upfile");

        // 获取请求的信息
        String name = part.getHeader("content-disposition");
        System.out.println(name);

        String root = req.getServletContext().getRealPath("/upload");
        System.out.println(root);

        // 文件类型后缀
        String str = name.substring(name.lastIndexOf("."), name.length() - 1);
        System.out.println(str);
        // 新的路径文件名
        String uploadPath = "d:/upload";
        // String filename = root + "\\" + UUID.randomUUID().toString() + str;
        String filename = uploadPath + "/" + UUID.randomUUID().toString() + str;
        System.out.println(filename);

         part.write(filename);
    }
}
/* 控制台结果输出 */
form-data; name="upfile"; filename="D:\Downloads\潘凯的个人简历.pdf"
D:\workspace-j2ee\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\servlet3upload\upload
.pdf
d:/upload/d4773501-225a-484e-b953-42231b9409d0.pdf

项目源代码:


想要查看更多文章,敬请关注 dravenxiaokai 的简书

哇,写的太赞了,别拦着我打赏 o( ̄︶ ̄)o

微信打赏 支付宝打赏
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 本章聊一聊ServletContext 3.0规范中定义的注解以及在web应用中使用的框架和库的可插拔性的提升。 ...
    Lucky_Micky阅读 11,286评论 0 3
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 47,222评论 6 342
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,264评论 19 139
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,564评论 11 349
  • 一直在路上,走着以为是终点的方向 坐拥山水 啜饮光阴 最美的遇见惊艳了眼眸 走过海角,错过花开,匆匆忙忙,跌跌撞撞...
    北在北方_560a阅读 4,503评论 0 0

友情链接更多精彩内容