SpringInAction--SpringMvc高級技術(servlet、filter、multipart)

前面學了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文件上傳,這個用的也蠻多的,我通常圖像啊,文件啊,上傳都是用這個上傳的。

通常來講分爲兩種:

  • CommonsMultipartResolver:使用Jakarta Commons FileUpload解析Multipart請求
  • StandardServletMultipartResolver:依賴於Servlet 3.0對multipart請求的支持(始於Spring 3.1)。

 首先咱們來看看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中 一些經常使用的其餘技術,若是有錯請指出,謝謝!

相關文章
相關標籤/搜索