Java註解-註解處理器、servlet3.0|樂字節

你們好,我是樂字節的小樂,上次給你們帶來了Java註解-元數據、註解分類、內置註解和自定義註解|樂字節,此次接着往下講註解處理器和servlet3.0html

 

1、註解處理器

使用註解的過程當中,很重要的一部分就是建立於使用註解處理器。Java SE5擴展了反射機制的API,以幫助程序員快速的構造自定義註解處理器。java

一、註解處理器類庫java.lang.reflect.AnnotatedElement

Java使用Annotation接口來表明程序元素前面的註解,該接口是全部Annotation類型的父接口。除此以外,Java在java.lang.reflect 包下新增了AnnotatedElement接口,該接口表明程序中能夠接受註解的程序元素,該接口主要有以下幾個實現類:程序員

Class:類定義
Constructor:構造器定義
Field:累的成員變量定義
Method:類的方法定義
Package:類的包定義api

java.lang.reflect 包下主要包含一些實現反射功能的工具類,實際上,java.lang.reflect 包全部提供的反射API擴充了讀取運行時Annotation信息的能力。當一個Annotation類型被定義爲運行時的Annotation後,該註解才能是運行時可見,當class文件被裝載時被保存在class文件中的Annotation纔會被虛擬機讀取。數組


AnnotatedElement 接口是全部程序元素(Class、Method和Constructor)的父接口,因此程序經過反射獲取了某個類的AnnotatedElement對象以後,程序就能夠調用該對象的以下四個個方法來訪問Annotation信息:瀏覽器

①<T extends Annotation> T getAnnotation(Class<T> annotationClass): 返回該程序元素上存在的、指定類型的註解,若是該類型註解不存在,則返回null。app

②Annotation[] getAnnotations():返回該程序元素上存在的全部註解。異步


③boolean is AnnotationPresent(Class<?extends Annotation> annotationClass):判斷該程序元素上是否包含指定類型的註解,存在則返回true,不然返回false.jsp


④Annotation[] getDeclaredAnnotations():返回直接存在於此元素上的全部註釋。與此接口中的其餘方法不一樣,該方法將忽略繼承的註釋。(若是沒有註釋直接存在於此元素上,則返回長度爲零的一個數組。)該方法的調用者能夠隨意修改返回的數組;這不會對其餘調用者返回的數組產生任何影響。async

二、解析實例

public class ParseCoder { public static void main(String[] args) { String coderName="名稱:"; String coderType="類型:"; String coderProvider="廠家信息以下 "; Field [] fields=Coder.class.getDeclaredFields(); for(Field field:fields){ if(field.isAnnotationPresent(Programmer.class)){ Programmer pro=(Programmer)field.getAnnotation(Programmer.class); coderName=coderName+pro.value(); System.out.println(coderName); }else if(field.isAnnotationPresent(ProgrammerType.class)){ ProgrammerType type=(ProgrammerType)field.getAnnotation(ProgrammerType.class); coderType=coderType+type.type().toString(); System.out.println(coderType); }else if(field.isAnnotationPresent(ProgrammerProductor.class)){ ProgrammerProductor fruitProvider=(ProgrammerProductor)field.getAnnotation(ProgrammerProductor.class); coderProvider+="編號:"+fruitProvider.id()+" 名稱:"+fruitProvider.name()+" 地址:"+fruitProvider.address(); System.out.println(coderProvider); } } } }

2、 Servlet3.0

@WebServlet

使用註解達到零配置,開發servlet項目,使用@WebServlet將一個繼承於javax.servlet.http.HttpServlet的類定義爲Servlet組件。在Servlet3.0中,能夠使用@WebServlet註解將一個繼承於javax.servlet.http.HttpServlet的類標註爲能夠處理用戶請求的Servlet。

@WebServlet註解的相關屬性

 

Servlet的訪問URL是Servlet的必選屬性,能夠選擇使用urlPatterns或者value定義。如一個Servlet能夠描述成:

@WebServlet(name="ServletDemo",value="/ServletDemo")。

也定義多個URL訪問:如

@WebServlet(name="ServletDemo",urlPatterns={"/ServletDemo","/ServletDemo2"})

或者:

@WebServlet(name="AnnotationServlet",value={"/ServletDemo","/ServletDemo2"})

initParams能夠用來指定當前Servlet的初始化參數,它是一個數組, 裏面每個@WebInitParam表示一個參數。

@WebServlet(value="/servlet/init-param", initParams={@WebInitParam(name="param1", value="value1")})

測試實例以下

/**  * 使用@WebServlet將一個繼承於javax.servlet.http.HttpServlet的類定義爲Servlet組件。 如@WebServlet有不少的屬性: 一、asyncSupported: 聲明Servlet是否支持異步操做模式。 二、description:   Servlet的描述。 三、displayName: Servlet的顯示名稱。 四、initParams: Servlet的init參數。 五、name:     Servlet的名稱。 六、urlPatterns:Servlet的訪問URL。 七、value:    Servlet的訪問URL。 Servlet的訪問URL是Servlet的必選屬性,能夠選擇使用urlPatterns或者value定義。 如@WebServlet(name="TestServlet",value="/TestServlet"),也定義多個URL訪問: 如@WebServlet(name="TestServlet",urlPatterns={"/TestServlet","/Test"}) 或@WebServlet(name="TestServlet",value={"/TestServlet","/Test"})  */ @WebServlet(name="/TestServlet",urlPatterns={"/test"}) public class TestServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.getWriter().print("hello servlet3"); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }

 

初始化參數

@WebServlet(value="/init", initParams={@WebInitParam(name="param1", value="sxt")}) public class TestInit extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Enumeration<String> paramNames = this.getServletConfig().getInitParameterNames(); String paramName; while (paramNames.hasMoreElements()) { paramName = paramNames.nextElement(); response.getWriter().append(paramName + " = " + this.getServletConfig().getInitParameter(paramName)); } response.getWriter().close(); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }

 

@WebFilter

/**  * 使用註解標註過濾器:@WebFilter將一個實現了javax.servlet.Filter  * 接口的類定義爲過濾器,屬性filterName聲明過濾器的名稱,可選  * 屬性urlPatterns指定要過濾 的URL模式,也可以使用屬性value來聲明.  * (指定要過濾的URL模式是必選屬性),  * 能夠指定多種過濾模式@WebFilter(filterName="TestFilter",  * urlPatterns={"/User","/index.jsp"})  * @author Administrator  */ @WebFilter(filterName="TestFilter",urlPatterns="/*") public class TestFilter implements Filter { @Override public void destroy() { System.out.println("過濾器銷燬"); } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { System.out.println("執行過濾操做"); chain.doFilter(request, response); } @Override public void init(FilterConfig arg0) throws ServletException { System.out.println("過濾器初始化"); } }

@MultipartConfig

使用註解@MultipartConfig將一個Servlet標識爲支持文件上傳。Servlet3.0將multipart/form-data的POST請求封裝成Part,經過Part對上傳的文件進行操做。

注意:Servlet3沒有提供直接獲取文件名的方法,須要從請求頭中解析出來

1)、頁面製做

<%@ 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> <fieldset> <legend>上傳文件</legend> <!-- 文件上傳時必需要設置表單的enctype="multipart/form-data" --> <form action="${pageContext.request.contextPath}/upload" method="post" enctype="multipart/form-data">  上傳文件:<input type="file" name="file1"><br/>  上傳文件:<input type="file" name="file2"><br/> <input type="submit" value="上傳"> </form> </fieldset> </body> </html>

2)、編寫Servlet

/**  * Servlet3.0將multipart/form-data的POST請求封裝成Part,  * 經過Part對上傳的文件進行操做,Servlet3沒有提供直接獲取文件名的方法,  * 須要從請求頭中解析出來,獲取請求頭,請求頭的格式:  * 火狐和google瀏覽器下:form-data; name="file"; filename="snmp4j--api.zip" * @author Administrator  */ @WebServlet(name = "TestUpload", urlPatterns = "/upload") @MultipartConfig public class TestUpload extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); response.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=utf-8"); // 存儲路徑 String savePath = request.getServletContext().getRealPath("/WEB-INF/upload"); // 獲取上傳的文件集合  Collection<Part> parts = request.getParts(); //上傳單個文件  if (parts.size()==1) { //經過文件名獲取文件  Part part = request.getPart("file"); //從請求頭中獲取文件  String header = part.getHeader("content-disposition"); //獲取文件名  String fileName = getFileName(header); //把文件寫到指定路徑  part.write(savePath+File.separator+fileName); }else{ for (Part part : parts) {//循環處理上傳的文件 //請求頭的格式:form-data; name="file"; filename="snmp4j--api.zip"  String header = part.getHeader("content-disposition"); //獲取文件名 String fileName = getFileName(header); if(!fileName.equals("")){ //把文件寫到指定路徑  part.write(savePath+File.separator+fileName); } } } PrintWriter out = response.getWriter(); out.println("上傳成功"); out.flush(); out.close(); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doGet(req,resp); } /**  * 獲取文件名 * 火狐和google瀏覽器下:form-data; name="file"; filename="snmp4j--api.zip"  * @param header  * @return  */ private String getFileName(String header) { String[] headArr = header.split(";")[2].split("="); //獲取文件名,兼容各類瀏覽器的寫法  return headArr[1].substring(headArr[1].lastIndexOf("\\")+1).replaceAll("\"", ""); } }

@WebListener

Servlet3.0提供@WebListener註解將一個實現了特定監聽器接口的類定義爲監聽器。將實現了ServletContextListener接口的MyServletContextListener標註爲監聽器。

@WebListener public class TestListener implements ServletContextListener { @Override public void contextDestroyed(ServletContextEvent event) { System.out.println("ServletContext銷燬"); } @Override public void contextInitialized(ServletContextEvent event) { System.out.println("ServletContex初始化"); System.out.println(event.getServletContext().getServerInfo()); } }

有關注解就介紹到這裏了,感謝各位老闆的光顧和學習。

請繼續關注樂字節,後續不斷更新Java乾貨資料和視頻。

相關文章
相關標籤/搜索