摘要:擴展了反射機制的,以幫助程序員快速的構造自定義注解處理器。返回該程序元素上存在的所有注解。在中,可以使用注解將一個繼承于的類標注為可以處理用戶請求的。
大家好,我是樂字節的小樂,上次給大家帶來了Java注解-元數據、注解分類、內置注解和自定義注解|樂字節,這次接著往下講注解處理器和servlet3.0
使用注解的過程中,很重要的一部分就是創建于使用注解處理器。Java SE5擴展了反射機制的API,以幫助程序員快速的構造自定義注解處理器。
1、注解處理器類庫java.lang.reflect.AnnotatedElementJava使用Annotation接口來代表程序元素前面的注解,該接口是所有Annotation類型的父接口。除此之外,Java在java.lang.reflect 包下新增了AnnotatedElement接口,該接口代表程序中可以接受注解的程序元素,該接口主要有如下幾個實現類:
Class:類定義
Constructor:構造器定義
Field:累的成員變量定義
Method:類的方法定義
Package:類的包定義
java.lang.reflect 包下主要包含一些實現反射功能的工具類,實際上,java.lang.reflect 包所有提供的反射API擴充了讀取運行時Annotation信息的能力。當一個Annotation類型被定義為運行時的Annotation后,該注解才能是運行時可見,當class文件被裝載時被保存在class文件中的Annotation才會被虛擬機讀取。
AnnotatedElement 接口是所有程序元素(Class、Method和Constructor)的父接口,所以程序通過反射獲取了某個類的AnnotatedElement對象之后,程序就可以調用該對象的如下四個個方法來訪問Annotation信息:
①
②Annotation[] getAnnotations():返回該程序元素上存在的所有注解。
③boolean is AnnotationPresent(Class annotationClass):判斷該程序元素上是否包含指定類型的注解,存在則返回true,否則返回false.
④Annotation[] getDeclaredAnnotations():返回直接存在于此元素上的所有注釋。與此接口中的其他方法不同,該方法將忽略繼承的注釋。(如果沒有注釋直接存在于此元素上,則返回長度為零的一個數組。)該方法的調用者可以隨意修改返回的數組;這不會對其他調用者返回的數組產生任何影響。
2、解析實例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); } } } }二、 Servlet3.0 1、@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有很多的屬性: 1、asyncSupported: 聲明Servlet是否支持異步操作模式。 2、description: Servlet的描述。 3、displayName: Servlet的顯示名稱。 4、initParams: Servlet的init參數。 5、name: Servlet的名稱。 6、urlPatterns:Servlet的訪問URL。 7、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 { Enumeration2、@WebFilterparamNames = 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將一個實現了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("過濾器初始化"); } }3、@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"%>文件上傳
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"); // 獲取上傳的文件集合 Collection4、@WebListenerparts = 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(""", ""); } }
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干貨資料和視頻。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/75610.html
摘要:注解有以下幾個知識點元數據注解的分類內置注解自定義注解注解處理器本文先介紹前面個知識點元數據注解的分類內置注解自定義注解。注解相當于是一種嵌入在程序中的元數據,可以使用注解解析工具或編譯器對其進行解析,也可以指定注解在編譯期或運行期有效。 大家好,我是樂字節的小樂,上次說過了Java多態的6大特性|樂字節,接下來我們來看看Java編程里的注解。showImg(https://segme...
摘要:上一篇小樂給大家說了樂字節新特性之,接下來小樂繼續給大家說一說新特性之和重復注解與類型注解。內部類與方法相關的內部類這是一個靜態類。也是一個靜態類。 上一篇小樂給大家說了《樂字節-Java8新特性之Date API》,接下來小樂繼續給大家說一說Java8新特性之Base64和重復注解與類型注解。 一、Base64 在Java 8中,內置了Base64編解碼相關的特性。Java 8中使用...
摘要:依賴于對請求的支持。使用解析兼容的沒有構造器參數,也沒有要設置的參數,這樣,在應用上下文中,將其聲明為就會非常簡單。默認是沒有限制的整個請求的容量。 Spring MVC 高級的技術 本章內容: Spring MVC配置的替代方案 處理文件上傳 在控制器中處理異常 使用flash屬性 稍等還沒結束 說明 如果你有幸能看到。后面的章節暫時不更新了,改變學習方式了。重要理解思想,這本書...
摘要:注意當多個父接口中存在相同的默認方法時,子類中以就近原則繼承。定義靜態默認方法這是版簡易計算器接口默認方法使用定義接口并提供默認打印方法定義接口默認方法支持方法形參這是數值運算基本接口。。。 總概 JAVA8 已經發布很久,而且毫無疑問,java8是自java5(2004年發布)之后的最重要的版本。其中包括語言、編譯器、庫、工具和JVM等諸多方面的新特性。 Java8 新特性列表如下:...
閱讀 919·2023-04-25 23:40
閱讀 3706·2021-11-22 15:22
閱讀 3541·2021-10-09 09:44
閱讀 3399·2021-09-23 11:52
閱讀 1251·2021-09-22 15:43
閱讀 780·2021-09-10 10:51
閱讀 2202·2021-09-06 15:02
閱讀 3185·2021-09-06 15:02