Servlet3.0的簡單使用


Servlet3.0(WEB3.0)算是比較新的Servlet技術了,對應的JavaEE版本是6,雖然目前最新的版本是3.1,對應版本JavaEE7。我們目前使用的做多的還是Servlet2.5的東西,所以3.0僅做一個了解

要求

  • MyEclipse10.0或以上版本
  • 發布到Tomcat7.0或以上版本

概述

注解代替web.xml配置文件,可以不使用web.xml文件,所以在創建JavaEE6.0版本時,會發現默認不創建web.xml
對上傳的支持,在Servlet2.5中,我們更多的使用第三方的jar來完成上傳文件(如commons-fileupload),在3.0中可以不添加其他jar來完成上傳文件

注解代替配置文件

我們可以先干掉web.xml,注解主要圍繞JavaWeb的三大組件(Servlet,Filter,Linstener)

Servlet類

我只需要在Servlet類上面添加@WebServlet(urlPatterns="servlet路徑") 即可

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

@WebServlet(urlPatterns="/AServlet", 
initParams={
    @WebInitParam(name="p1", value="v1"),
    @WebInitParam(name="p2", value="v2")
},
loadOnStartup=1
)
public class AServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    public AServlet() {
        super();
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String userName = (String) request.getParameter("userName");
        if(userName==null||userName.equals("")){
            request.setAttribute("msg", "請先登錄");
            request.getRequestDispatcher("/session1/login.jsp").forward(request, response);
        }else{
            if(userName.equalsIgnoreCase("lz")){
                //登錄成功
                HttpSession session = request.getSession();
                session.setAttribute("userName", userName);
                //寫入Cookie
                Cookie cookie=new Cookie("uname", userName);
                cookie.setMaxAge(60*60);
                response.addCookie(cookie);
                
                response.sendRedirect("/day11/session1/succ1.jsp");    
            }else{
                //登錄失敗
                request.setAttribute("msg", "請先登錄");
                request.getRequestDispatcher("/session1/login.jsp").forward(request, response);
            }
        }
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

}

這個initParams屬性的配置在注解中使用並不是很好,既然在注解中使用,為何不直接點在代碼中定義變量參數。但只有urlParrents時,可以忽略這個屬性名,直接給個值 :@WebServlet("/AServlet")  ,其實一個Servlet可以配置多個url,不然這個屬性單詞最后也不會帶s,雖然一般我們不這樣使用

Filter

Filter使用@WebFilter注解,其中也有一個urlParrents屬性用來表示需要過濾的資源,這個urlParrents也可以省略

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;

@WebFilter(urlPatterns="/*")
public class AFilter implements Filter {

    @Override
    public void destroy() {
        // TODO Auto-generated method stub
        
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse repsonse,
            FilterChain chain) throws IOException, ServletException {
        System.out.println("哈哈~,你看到我沒有!");
        chain.doFilter(request, repsonse);  //放行
    }

    @Override
    public void init(FilterConfig arg0) throws ServletException {
        // TODO Auto-generated method stub
        
    }

}

Listener

監聽器使用@WebListener,監聽器的注解不需要屬性值

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;


@WebListener
public class AListener implements ServletContextListener {


    public AListener() {
        // TODO Auto-generated constructor stub
    }


    public void contextDestroyed(ServletContextEvent arg0)  { 
         // TODO Auto-generated method stub
    }

    public void contextInitialized(ServletContextEvent arg0)  { 
         // TODO Auto-generated method stub
    }
    
}

上傳的支持

上傳對表單的要求(所有的上傳對前端頁面都是這些要求):

  1.     method="post"
  2.     enctype="multipart/form-data",它的默認值是:application/x-www-form-urlencoded
  3.     <input type="file" name="必須給"/>

我們只需要在Servlet上添加@MultipartConfig注解即可

當然也可以為@MultipartConfig注解指定屬性值,它有四個屬性:

  • int filesizeThreshold:指定緩存的大小,當超出這個大小后,文件會保存到磁盤上;
  • String location:指定臨時文件的目錄;
  • long maxFilesize:指定上傳單個文件的大小限制,如果上傳的誰的超出了這個大小,那么就會拋出異常;
  • long maxRequestSize:指定整個表單的大小限制。

當在Servlet上使用了@MultipartConfig注解后,那么就可以使用request.getPart(“fieldName”)來獲取<input:file>的內容,其中Part表示一個文件表單項,接着就可以使用Part對象的API

import java.io.IOException;
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("/CServlet")
@MultipartConfig
public class CServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
      request.setCharacterEncoding("utf-8");
        //Servlet3.0對文件上傳的支持
        String userName = request.getParameter("userName");
        
        Part part = request.getPart("file");
        //獲得文件的MIME類型
        System.out.println(part.getContentType());
        //獲得文件的字節數
        System.out.println(part.getSize());
        //獲得文件字段名
        System.out.println(part.getName());
        //獲取文件名
        System.out.println(part.getSubmittedFileName());
        
    //保存圖片到硬盤
        part.write("d:/xxx.jpg");
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM