java

Servlet3.0注解技术

2017-10-14  本文已影响0人  dravenxiaokai

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

微信打赏 支付宝打赏
上一篇下一篇

猜你喜欢

热点阅读