java框架:spring mvc學習總結


是根據B站視頻中尚學堂某個老師的視頻自學來的,不保證正確,算是自己踩的一些坑.大概是根據那個進行總結了一下.都是比較基礎的東西吧.
視頻地址


    web.xml的配置.

配置爲Servlet,

 <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <!--下面設置爲更改默認配置文件,如果不設置這裏,那麼需要在WEB-INF下面寫一個springmvc的配置文件
            默認名字爲         servletName-servlet.xml如這裏的springmvc-servlet.xml-->
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath*:mvc.xml</param-value>
        </init-param>
        <!-- load-on-startup定義爲1即爲應用開始即執行.-->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <!--這裏的url-parrrern我理解爲打開springmvc的設置,即只有訪問到這裏的時候纔會運行springmvc.如果設置爲根目錄,則任何時候都會執行springmvc,然後在springmvc的配置文件裏執行查找處理器,渲染等操作.-->
        <url-pattern>/</url-pattern>
    </servlet-mapping>

    配置springmvc的配置文件.

流程大概就是handlermapping處理傳進來的url地址並交給控制器進行處理,處理之後的數據交給渲染器,然後返回頁面.
有兩種方法可以進行配置

1.使用xml文件配置.
第一種方法
  <!--配置handler mapping-->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
<!--配置handler adapter,根據教程所講內容,若配置這裏springmvc會自動進行適配,若不配置這裏,則請求的url地址嚴格根據名字來進行(包括後綴)-->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>
<!--配置渲染器-->
<bean id="jspViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
    <property name="prefix" value="/WEB-INF/jsp/"/>
    <property name="suffix" value=".jsp"/>
</bean>
<!--配置接收和處理器-->
<bean name="/hello" class="com.netizen.springmvc.HelloComtroller"></bean>

第二種方法

    <!--第二種配置springmvc的controller的方法,非註解的方法,使用集合,一次性配置多個controller-->
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
    <property name="mappings">
         <props>
             <!--key對應url的請求地址,value爲處理器的!! ID !!,這樣還需要在外部再寫一個bean進行配置.-->
             <prop key="hello.do">HelloController</prop>
         </props>
    </property>
</bean>
<bean id="HelloController" class="com.netizen.springmvc.HelloComtroller"></bean>

第三種方法

<!--第三種配置,URL匹配,這個沒太明白,好像是根據Controller的類名字來進行匹配的,不太懂-->
<bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"></bean>
<!--比如這裏的類名字爲helloController,那麼將自動匹配url爲hello*的地址進行處理.-->
<bean id="HelloController" class="com.netizen.springmvc.HelloComtroller">

2.使用註解

<!--添加下列語句自動掃包,然後只配置一個渲染器.-->
       <context:component-scan base-package="com.netizen.springmvc"/>
<!--配置渲染器-->
<bean id="jspViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
    <property name="prefix" value="/WEB-INF/jsp/"/>
    <property name="suffix" value=".jsp"/>
</bean>

    控制器類的填寫,請求過來的內容在這裏進行處理.

兩種實現方法
1.不使用註解,對應springmvc不使用註解的配置

//實現Controller接口,然後重寫方法,handleRequest,返回一個ModelAndView實例.
public class HelloComtroller implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
    ModelAndView mv = new ModelAndView();
//      這裏還不是很理解.
    mv.addObject("msg","hello,springmvc");
//        視圖名字,在這裏設置好之後對應springmvc配置文件裏面的前後綴方法,會自動在應用裏尋找視圖,如這裏會尋找/WEB-INF/jsp/hello.jsp.
    mv.setViewName("hello");
    return mv;
}
}

2.使用註解:

//添加Controller註解和RequestMapping()註解進行配置,對應使用註解的springmvc配置.
@Controller
public class HelloC {
//    請求爲*.do的時候就會去尋找一個hello的視圖去返回.在web.xml裏面配置的是當請求在/的時候會調用mvc的框架開始運行和處理.
@RequestMapping("/*.do")
public ModelAndView hello(HttpServletRequest request, HttpServletResponse response){
    ModelAndView mv = new ModelAndView();
    mv.addObject("msg","annotation springmvc ");
     mv.setViewName("hello");
     return mv;
}
}

    數據處理和轉發

內容比較少,這部分都寫在代碼裏面了,要注意一下return時候的跳轉,這是在沒有頁面渲染器的情況下寫的,跳轉到的都是index.jsp,因爲index在根目錄下,這裏我感覺不使用渲染器那麼就得寫絕對路徑了,感覺上有點不太方便.

package com.netizen.springmvc;
//轉發和重定向的方法.
import ...

@Controller
public class HelloZF {
    @RequestMapping("/hello1")
    public void hello1(HttpServletRequest request,HttpServletResponse response) throws IOException {
        response.getWriter().println("轉發和跳轉的實驗1");
    }
// 使用HttpServlet進行重定向
    @RequestMapping("/hello2")
    public void hello2(HttpServletRequest request,HttpServletResponse response) throws IOException {
        response.sendRedirect("index.jsp");
    }
//使用HttpServlet進行轉發
    @RequestMapping("/hello3")
    public void hello3(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
        request.setAttribute("msg","hello3 method");
        request.getRequestDispatcher("index.jsp").forward(request,response);
    }

//    通過springMVC進行轉發和重定向----上面的就是普通的Servlet-api的方法.下面這是無視圖解析器時候的方法.
    @RequestMapping("/hello4")
    public String hello4(HttpServletRequest request,HttpServletResponse response){
//這裏的return hello,實際上因爲有視圖解析器的存在會跳到WEB-INF/jsp路徑下去尋找..
//        return "hello";
        System.out.println("request的值爲 ---" + request);
        request.setAttribute("msg","index.jsp have been forward");
        return "forward:index.jsp";
//        return  "redirect:index.jsp";
    }
//    通過SpringMVC進行轉發和重定向 ----有視圖解析器的時候.
    @RequestMapping("/hello5")
        public String hello5(){
//            沒節省多少,轉發可以少寫.重定向的話因爲是直接跳到另一個網頁上,所以不需要視圖解析器.
//        return "hello";
        return "redirect:index.jsp";
        }
//        data的獲取.可以指定域請求的參數名字,使用@RequestParam註解.
        @RequestMapping("/hello6")
        public String hello6(@RequestParam("uname")String name){
            System.out.println("name的值爲 ---" + name);
            return  "index.jsp";
        }
//從域參數中得到一個實例
        @RequestMapping("/user")
        public String hello7(User user){
            System.out.println(user);
            return "index.jsp";
        }
        @RequestMapping("/hello8")
        public String hello8(@RequestParam("uname")String name, ModelMap mp){
            mp.addAttribute("name",name);
            return "index.jsp";
        }
    }


數據處理的內容還是相對簡單的,這裏我有一個疑問,就是post的咋辦?後邊學習應該會講吧..


    亂碼的解決和Restful

亂碼的解決

  <!--SpringMVC的filter解決亂碼的問題.這個方法似乎只能解決post亂碼的問題.get亂碼通常是因爲jsp文件裏面pageencoding屬性不是utf-8-->
<filter>
    <filter-name>CharacterEncodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
        <param-name>CharacterEncodingFilter</param-name>
        <param-value>utf-8</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>CharacterEncodingFilter</filter-name>
    <url-pattern>/</url-pattern>
</filter-mapping>

Restful風格

//        restful風格代碼的編寫,其實是一種從url地址中獲得參數的方法,如此不用再寫RequestParam
//    注意使用這種方法的時候,如果在web.xml裏面定義了打開springmvc的url-pattern,那麼需要變化後綴.
    @RequestMapping("/hello9/{id}/{uid}")
    public String hello(@PathVariable int id,@PathVariable int uid){
//        也可以使用下面這種方式,使用帶參的註解,表示將url中id的值傳遞給了uid
//        public String hello(@PathVariable("id") int uid,@PathVariable("uid") int id)
        System.out.println("id的值爲 ---" + id);
        System.out.println("uid的值爲 ---" + uid);
        return "index.jsp";

    使用commons-fileupload和commons-io包進行文件的上傳

1.在springMVC的xml文件中配置fileupload的解析器.

  <!--SpringMVC的filter解決亂碼的問題.這個方法似乎只能解決post亂碼的問題.get亂碼通常是因爲jsp文件裏面pageencoding屬性不是utf-8-->
<filter>
    <filter-name>CharacterEncodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
        <param-name>CharacterEncodingFilter</param-name>
        <param-value>utf-8</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>CharacterEncodingFilter</filter-name>
    <url-pattern>/</url-pattern>
</filter-mapping>

2.編寫fileupload的Controller

@Controller
public class fileUploadController {
@RequestMapping("/upload")
//    需要注意的一點是,這裏必須要寫 @requestparam(file)
public String fileupload(@RequestParam("file") CommonsMultipartFile file, HttpServletRequest request) throws IOException {
//    這裏要比較熟悉java的IO才行,還不太熟練。
//        獲取上傳文件的路徑。
    String path = request.getRealPath("/fileupload");
//        因爲已經是上傳的文件,已經打開了一個寫入流。
    InputStream is = file.getInputStream();
//        輸出流
    OutputStream os = new FileOutputStream(new File(path,file.getOriginalFilename()));
    int len=0;
    byte[] buffer = new byte[400];
    while((len=is.read())!=-1){
        os.write(buffer,0,len);
    }
    os.close();
    is.close();
    return "index";
}
}

3.編寫upload.jsp

<%--
method必須爲post,enctype=multipart/form-data
--%>
<form action="upload" method="post" enctype="multipart/form-data">
    file:<input type="file" name="file">
    <input type="submit" value="上傳">
</form>

4.坑:maven打包,不會打包webapp裏面的fileupload文件夾.
沒有!
查找了一些資料:
使用plugin 插件
使用插件
不忽略空文件夾
打包到指定文件夾 繁瑣一些

以上方法似乎都不可行.我操.
到最後還是部署之後自己在target裏創建的文件夾…


    進行ajax和json的傳遞

1.使用HttpServlet

@Controller
public class AjaxController {
@RequestMapping("/ajax")
public void ajax(String name,HttpServletResponse response) throws IOException {
    response.getWriter().println("123123");
}

2.使用jackson的包和配置文件進行設置.
主要需要注意的是springmvc的配置文件怎麼寫.視頻裏的那個類我沒找到,百度得到結果是那個類已經不用了,改爲使用另一個類,還有一個說法是使用<!--<mvc:annotation-driven/>這個東西來進行對json的處理,但是我弄了之後總是報錯,我也看不懂錯在哪..所以還是使用了替代的類.
配置如下:

        <!--註解的使用打開-->
<context:component-scan base-package="com.springMVC"></context:component-scan>
    <!--打開json的解析器-->
    <!--<mvc:annotation-driven></mvc:annotation-driven>-->
    <bean id="stringConverter" class="org.springframework.http.converter.StringHttpMessageConverter">
        <property name="supportedMediaTypes">
            <list>
                <value>text/plain;charset=UTF-8</value>
            </list>
        </property>
    </bean>
<bean id="jsonConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"></bean>
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
    <property name="messageConverters">
        <list>
            <ref bean="stringConverter"></ref>
            <ref bean="jsonConverter"></ref>
        </list>
    </property>
</bean>

這樣返回的結果就是json的對象了,在前端進行處理.

搞不明白各種東西什麼情況….json的
參考資料1
參考資料2
參考資料3


    關於攔截器

視頻中講的很簡單..配置一下,實現了三個方法.應該深入一些..

<!--配置攔截器-->
<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/**"/>
        <bean class="com.springMVC.interceptorController"></bean>
    </mvc:interceptor>
</mvc:interceptors>

登陸攔截器,這裏比較重要,對我來說有點彎路..
簡單點來說就是當在login.jsp中點擊submit提交到login之後,本來應該是由UserController來進行處理,查看是否密碼正確,如果正確則建立一個session,如果不正確返回到當前頁面,現在加入了一個攔截器,,作用就是攔截當前界面,查看是否已經登陸,實際上,我認爲老師這裏講的不是很清晰,覺得流程應該是當訪問一個頁面的時候,如果沒有用戶沒有登陸卻訪問了界面,那麼就會被攔截下來,然後跳轉到登陸界面,讓用戶進行登陸,如果訪問的網址在允許訪問的列表裏面,纔會接着進行訪問,返回true,然後進行用戶名密碼的判斷,如果正確則建立一個session.否則,重新開始.



    log4j idea的使用(Maven)
1.Maven的pom.xml中添加包依賴
2.配置log4j.properties,參考資料1 參考資料2 參考資料3
參考資料4:改變配置文件路徑.
3.記得在pom.xml文件裏面把log4j.properties的過濾給去掉.


    使用IDEA創建SpringMVC(未使用Maven)
1.創建時選擇SpringMVC,Spring,WebService三個,讓idea自動下載包.
2.下載tomcat,配置好tomcat,包括端口一類的設置.
3.項目配置(ctrl+shift+alt+s):
導入Tomcat/lib下的servlet-api和jsp-api包,否則會找不到包(我似乎導入了也不能自動給出提示,還需要在類裏手動導包,不懂咋回事.)
除此之外,還需要下載jstlstandard這倆包,否則在配置springmvc的時候同樣會報錯,具體情況不太瞭解,好像是servlet的xml配置標準根據這個來的.
在WEB-INF下創建classes和lib和jsp三個文件夾.
1.第一步添加到Lib
2.第二步
3.第三步
4.輸出
如此應該可以運行了.這裏配置可能有誤,因爲我也看不懂,大概是整合了網上了的一些教程吧.

4.結構圖.
結構圖


使用Maven進行配置了一遍.根據這個教程:SpringMVC indea maven 配置教程
其中碰到的小坑1:需要安裝完整的包:jstl jstl-api, standard jstl-impl 這四個都需要在maven裏面配置上.
其中碰到的小坑2:自定義設置SpringMVC的xml文件位置的時候,由於maven的限制,不能輸出到target裏面,參考:maven idea springmvc target

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章