前面學了spirng的一些配置,以及web方面的知識,今天就在學習一下在spring比較經常使用的一些高級技術。。。html
首先來介紹下什麼叫servlet吧(來着維基百科)java
Servlet(Server Applet),全稱Java Servlet,未有中文譯文。是用Java編寫的服務器端程序。其主要功能在於交互式地瀏覽和修改數據,生成動態Web內容。狹義的Servlet是指Java語言實現的一個接口,廣義的Servlet是指任何實現了這個Servlet接口的類,通常狀況下,人們將Servlet理解爲後者。web
Servlet運行於支持Java的應用服務器中。從實現上講,Servlet能夠響應任何類型的請求,但絕大多數狀況下Servlet只用來擴展基於HTTP協議的Web服務器。spring
我剛開始沒有接觸到框架的時候,寫的服務就是新建一個servlet,以後還知道了struct2 以後才知道spring框架。。json
spring in action 這本書中,推崇的配置是經常使用java來配置文件的。可是咱們好像在平時中經常使用的仍是xml配置。。先來看一下java註解來使用servlet的方法:服務器
public class MyServletConfig implements WebApplicationInitializer { public void onStartup(ServletContext servletContext) throws ServletException { Dynamic myServlet = servletContext.addServlet("myServlet", com.springmvc.servlet.TestServlet.class); myServlet.addMapping("/servlet"); } }
而後咱們在來看看xml的配置:session
<servlet> <servlet-name>servletTest</servlet-name> <servlet-class>com.springmvc.servlet.TestServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>servletTest</servlet-name> <url-pattern>/servlet</url-pattern> </servlet-mapping>
而後咱們建立一個調用接口HttpServlet的servlet:mvc
public class TestServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setContentType("text/html"); PrintWriter pw = resp.getWriter(); pw.write("<h1> hello servlet!</h1>"); } }
部署到Tomcat上面輸入 http://localhost:8080/servlet app
運行結果爲:框架
這樣一來簡單的servlet如何在springmvc中使用咱們就學會了.
下面就讓咱們來學一下filter的用法,首先是用java配置方式
public class MyFilterConfig implements WebApplicationInitializer { public void onStartup(ServletContext servletContext) throws ServletException { Dynamic myFilter = servletContext.addFilter("myFilter", com.springmvc.filter.TestFilter.class); myFilter.addMappingForUrlPatterns(null, false, "/back/*"); } }
下面是xml註解方式:
<filter> <filter-name>fileterTest</filter-name> <filter-class>com.springmvc.filter.TestFilter</filter-class> </filter> <filter-mapping> <filter-name>fileterTest</filter-name> <url-pattern>/back/*</url-pattern> </filter-mapping>
而後寫個TestFilter類,這個是我之前寫的一個簡單判斷是否登陸的一個filter,若是沒有登陸的話,就跳轉到登陸界面,只有登陸了以後才能繼續訪問某個文件夾,或者說某個項目下的東西:
public class TestFilter implements Filter { public void init(FilterConfig filterConfig) throws ServletException { } public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) servletRequest; HttpServletResponse resp = (HttpServletResponse) servletResponse; HttpSession session = req.getSession(); //獲取請求路徑 String path = req.getRequestURI(); //獲取session中做爲判斷的字段 String pwd = (String) session.getAttribute("passwd"); System.out.println(pwd); //判斷請求的 路徑中是否包含了 登陸頁面的請求 //若是包含了,那麼不過濾 繼續執行操做 if (path.indexOf("/back/login.do") > -1 || path.indexOf("/back/isLogin.json") > -1) { filterChain.doFilter(req, resp); } else { //如不包含,那麼就要判斷 session中否有標誌,若是沒有標誌,那麼不讓他看,讓他去登陸,反之執行操做! if (pwd == null || "".equals(pwd)) { resp.sendRedirect("/back/login.do"); } else { filterChain.doFilter(req, resp); } } } public void destroy() { } }
由於沒有寫 http://localhost:8080/back/login.do 的請求方法,因此是404,運行結果以下:
上面就是在springmvc中用filter
下面繼續來看multipart文件上傳,這個用的也蠻多的,我通常圖像啊,文件啊,上傳都是用這個上傳的。
通常來講分爲兩種:
首先咱們來看看java配置:
@Bean public MultipartResolver multipartResolver() { CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(); multipartResolver.setDefaultEncoding("utf-8"); multipartResolver.setMaxInMemorySize(40960); multipartResolver.setMaxUploadSize(10485760); return multipartResolver; }
xml的註解方式:
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <property name="defaultEncoding" value="utf-8"/> <property name="maxInMemorySize" value="40960"/> <property name="maxUploadSize" value="10485760"/> </bean>
而後在頁面中加上上傳所需的組件:
<h1>Multipart上傳測試</h1> <form id="form" enctype="multipart/form-data" action="/upload.do" method="post"> <input id="file" name="file" type="file"> <input type="submit" value="開始上傳"> </form>
這裏咱們要注意了 兩個地方 enctype method 這兩個參數 必定要有且後面的要爲post要否則會報錯
HTTP Status 500 - Request processing failed; nested exception is org.springframework.web.multipart.MultipartException: The current request is not a multipart request
一開始我忘記配置 上傳的配置了 報下面的錯:
HTTP Status 500 - Request processing failed; nested exception is java.lang.IllegalArgumentException: Expected MultipartHttpServletRequest: is a MultipartResolver configured?
controller的編寫也很簡單,以下:
@RequestMapping(value = "/upload.do", method = RequestMethod.POST) public String upLoadFiles(MultipartFile file) { File tempFile = new File("d://multipart.jpg"); try { file.transferTo(tempFile); return "success"; } catch (IOException e) { e.printStackTrace(); return "error"; } }
結果就不上了,以上就是springmvc中 一些經常使用的其餘技術,若是有錯請指出,謝謝!