springmvc 初學 入門

mvc框架的共有特徵:

架包的導入:

commons-logging-1.1.1.jar //日誌架包
spring-aop-4.0.0.RELEASE.jar
spring-beans-4.0.0.RELEASE.jar
spring-context-4.0.0.RELEASE.jar
spring-core-4.0.0.RELEASE.jar
spring-expression-4.0.0.RELEASE.jar
spring-web-4.0.0.RELEASE.jar
spring-webmvc-4.0.0.RELEASE.jar

一.請求分發,
    (url 定位到 一個java類的方法!!)
二.表單參數如何獲取?
    主動式?(servletAPI) 被動式?DI
三.跳轉到模板
四.

一.請求分發:(三種)

    1.servlet的方式:
        @Controller
        @RequestMapping("/demo")
        public class DemoServlet {
            @RequestMapping(method=RequestMethod.GET)
            public void doGet(HttpServletRequest res,HttpServletResponse es){
                System.out.println("get...");
            }
            @RequestMapping(method=RequestMethod.POST)
            public void doPostt(HttpServletRequest req,HttpServletResponse res){
                System.out.println("post...");
            }
        }
        //訪問方式:http://localhost:8080/springmvctest/demo.do
    2.類似struts1的方式:
            @Controller
            @RequestMapping("/struts1")
            public class StrutsController {
                @RequestMapping(params="method=add")
                public void findAll(){
                    System.out.println("add......");
                }
                @RequestMapping(params="method=findall")        
                public void findall(){
                    System.out.println("findall....");
                }
            }
    //訪問方式:http://localhost:8080/springmvctest/struts1.do?method=add
    3.類似與struts2的方式:(常用的)
        @controller
        @requestmapping("/user")   (可以不用這個一樣可以定位到!!)
        public class UserController{
            @requestmapping("/add")
            public void add(){
                System.out.println("add......")
            }
        }
    訪問方式:http://localhost:8080/springmvctest/user/add.do

    4.springmvc在Controller的局部變量是用的一個變量,方法執行完了就被釋放,而struts2的成員變量是一個action(請求)new一個對象,
    就算是調用的是同一個action
    5.默認的controller是單例的,

二.表單參數的獲取:(一共三種獲取了參數的方式。)

6.1)用(DI方式,方法參數的注入。)

            @RequestMapping("/user/login") //<DI方式 方法參數的動態注入!!>
            public void  login(@RequestParam("n")String uname,@RequestParam("p")String pwd){
                    System.out.println(uname+"....."+pwd);
                }
            訪問方式:http://localhost:8080/springmvctest/user/login.do?n=renchenhao&p=1234
    /**
     * required 該參數是否必須,默認爲true;
     * defaultValue 請求參數的默認值;
     * value值即請求參數的參數名;
     * @return
     */
    @RequestMapping(value="/testRequestParam")
    public String testRequestParam(@RequestParam(value="username") String un                                        
            ,@RequestParam(value="age",required = false,defaultValue="0") int ag){
        System.out.println("username="+un+"age:"+ag);
        return SUCCESS;
    }
//http://localhost:8080/springmvctest/testRequestParam?username=renchen&age=11  

6.2)模型驅動(一個java的類,用於參數的接受)

            @RequestMapping("/user/add")
            public void add(Uer uer){
                System.out.println();
                return SUCCESS;
            }
//pojo類
    //uer類
        String username ;
        String pwd;
        Adress adress;
        //省略get和set方法;
    //adress類 //級聯
        String city;
        //省略get和set方法
    <form action="testPojo">
        <input type="text" name="username"/>
        <input type="text" name="pwd"/>
        <input type="text" name="adress.city"/>
        <input type="submit" value="submit"/>   
    </form>
(說明:傳進來的值的屬性名與user的類裏面所聲明的成員變量相同的就自動賦值給它,)

6.3)restFULL方式 (http,uri的更加充分的利用)

            @RequestMapping("/user/{id}/del")
            public void del(@PathVariable("id") Integer id){//http 的restfull風格
                System.out.println("..........add....del"+id);
            }

7.解耦 模擬環境 自動化測試– >>

三.跳轉到模板:

怎麼傳遞參數,構建響應體!
    9.struts2中用的是result
    10.在springmvc中是:  return "forward:/welcome.jsp";
        (相對路徑,requestmapping的路徑)
            @RequestMapping("/user/login") //DI方式 方法參數的動態注入!!
            public String  login(@RequestParam("n")String uname,
                    @RequestParam("p")String pwd,HttpServletRequest session){
                System.out.println(uname+"....."+pwd);
                session.setAttribute("uname", uname);
                return "forward:/welcome.jsp";  // 這裏在forward:後面必須加一個/  不然就會使用相對路
                                                //徑,即把/user/addde之前的路徑附在之前作爲路徑。
            }
    11.1)ModelMap是map的實現,可以在其中存放屬性,作用域同request。通過
        el表達式,jstl,java代碼均可。
    11.2)爲了解耦,不推薦使用原生的HttpServletRequest而是使用ModelMap        
    12.有些面試官會問,你覺得struts2和springmvc框架的好處都是什麼啊?
        可以和環境解耦,便於環境測試!!
    13.1)springmvc關於跳轉(return "forward:/welcome.jsp"):簡化!!但是,在一些特殊場景中,反到帶來了不方便,
        有些網站的設計人員,不想外部的人員直接訪問,把工程放在了WEB-INF底下,
        那麼就得這樣寫(return "forward:/WEB-INF/welcome.jsp"),當網站較大時,這就帶來了一個弊端,需要重複寫
        很多代碼,這時就有了:"視圖解析器(幫我們定位到某一個資源的)".
    13.2)視圖解析器:(如果在return 中沒有家上 "forwward:" 那麼就會使用到視圖解析器)
        在springmvc-servlet.xml中加上這樣一條語句:
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
                <property name="prefix" value="/WEB-INF/ren/"></property>
                <property name="suffix" value=".jsp"></property>
</bean>
    14.重定向:返回值形如:return "redirect:http://www.baidu.com";
    15.中文編碼filter:
        在web.xml中加上這樣一條語句(這個控制亂碼方法的只對post的提交方式有用.):
                <filter>
                    <filter-name>CharacterEncodingFilter</filter-name>
                    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
                    <init-param>
                        <param-name>encoding</param-name>
                        <param-value>utf-8</param-value>
                    </init-param>
                </filter>
                <filter-mapping>
                    <filter-name>CharacterEncodingFilter</filter-name>
                    <url-pattern>/*</url-pattern>
                </filter-mapping>
        相當於servlet中的:
            request.setCharacterEncoding("UTF-8");
            response.setCharacterEncoding("UTF-8");

    16.ModelAndView模型視圖類(和用ModelMap map相似):
        見名知意,從名字上我們可以知道ModelAndView中的Model代表模型,View代表視圖。即,這個類
        把要顯示的數據存儲到了Model屬性中,要跳轉的視圖信息存儲到了View屬性。我們來看下ModelA
        ndView的部分源碼,即可知其中的關係:
            @RequestMapping("/user/add") //DI方式 方法參數的動態注入!!
            public ModelAndView  login(@RequestParam("n")String uname,@RequestParam("p")String pwd){
                System.out.println(uname+".../////.."+pwd);
                ModelAndView mv= new ModelAndView();
                mv.setViewName("hao/welcome");
                mv.getModelMap().put("a", uname);  
                return mv;  // 把返回參數改爲ModelAndView類型的
            }
    17.文件上傳(spring使用了apache-commons下的上傳組件,因此我們需要引入兩個jar包,學了maven後可以自動導):
        導包:
            1).Apache-commons-fileupload.jar(這兩個包可以在spring2.5.6中找到,或者在網上查找)
            2).apache-commons-io.jar
        ----------------------------------------------
        java文件代碼:
                package com.bjsxt.controller;
                import java.io.File;
                import java.io.IOException;
                import org.springframework.stereotype.Controller;
                import org.springframework.web.bind.annotation.RequestMapping;
                import org.springframework.web.bind.annotation.RequestParam;
                import org.springframework.web.multipart.commons.CommonsMultipartFile;

                @Controller
                public class UploadCont {
                    @RequestMapping("/toupload")
                    public String toUpload(){
                        return "hao/upload";
                    }
                    @RequestMapping("/upload")    //< !!!必須加上@RequestParam("file")!!!! >
                    public String upload(@RequestParam("file")CommonsMultipartFile file){
                        System.out.println(file.getOriginalFilename());

                        try {
                            file.transferTo(new File("D:/1.txt"));
                        } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                        }   
                    return "ok";        
                    }
                } 

spring-servlet.xml中的關於文件上傳的相關代碼:

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="maxUploadSize"><value>1203500</value></property> <!-- 最大文件大小(-1爲無限制) -->
        <property name="defaultEncoding"><value>utf-8</value></property><!-- 默認編碼 -->
        <property name="maxInMemorySize"><value>10240</value></property><!-- 最大內存大小 -->      
</bean>
        ---------------------------------------------
        jsp頁面代碼:
                <!--method必須是post    enctype必須是multipart/form-data-->
                <form action="upload.do" method="post" enctype="multipart/form-data">
                    <input type="text" name="name" />
                    <input type="file" name="file"/> <!--  這裏的name屬性的名字爲file這個和java文件中的傳入的形參的名字要相同 -->
                    <input type="submit" />
                </form> 
        ----------------------------------------------
        <注意:前後綴的問題> 
    18.1)
        1)端對端模式(通俗點講讓瀏覽器專門處理瀏覽器js,html的,後臺專門處理數據)
        2)jsp在後臺處理html,css,javascript(就是在後端處理前端的工作)
        3).動態頁面技術的發生是我們需要一種模板  -- 實現java,html,js等
        代碼複用(如jquery ui easyui)
        AngularJs(不懂!)
    18.2)
        處理ajax請求(json):
            手動的:
                ------------------------------------------
                1.java代碼:
                        package com.bjsxt.controller;
                        import org.springframework.stereotype.Controller;
                        import org.springframework.web.bind.annotation.RequestMapping;
                        import org.springframework.web.bind.annotation.ResponseBody;
                        import com.bjsxt.po.User;
                        @Controller
                        public class Ajax {                                 
                            @RequestMapping(value="/byid",produces="text/html;charset=utf-8")
                            public @ResponseBody String findById(Integer id){
                                User user= new User();
                                user.setId(id);
                                user.setName("ilsf");
                                user.setPhone("123456");
                                //這裏可以使用json工具轉化爲字符串
                                return "{\"id\":1,\"name\":'小嘎',\"phone\":'adfsdf'}"; //手動轉換                                    
                            }
                        }

                2.注意:
                    需要在spring-servlet.xml加上這一句話(必須加):<mvc:annotation-driven></mvc:annotation-driven>
                    最後的配置如果沒有<mvc:annotation-driven/>,那麼所有的Controller可能就沒有解析,所有當有請求時
                    候都沒有匹配的處理請求類,就都去<mvc:default-servlet-handler/>即default servlet處理了。添加上
                    <mvc:annotation-driven/>後,相應的do請求被Controller處理,而靜態資源因爲沒有相應的Controller就
                    會被default servlet處理。總之沒有相應的Controller就會被default servlet處理就ok了。<(這句話有待考究!!)>
                3.心得:
                    如果不加<mvc:annotation-driven/>那麼controller可能並沒有被解析,而是交給了<mvc:annotation-driven/>處理,
                有一點可以說明買就是當你攔截了全部請求的時候,就會顯示404錯誤,這是如果加上<mvc:annotation-driven/>,錯誤就會消失。
            //訪問方式:http://localhost:8080/springmvctest/byid.do?id=1
        接受json格式的數據:

發佈了29 篇原創文章 · 獲贊 4 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章