SpringMvc筆記

springMVC簡介

是MVC框架,和Spring無縫連接。

第1講:環境搭建

環境搭建都是從web.xml開始。

核心控制器DispacherServlet

說明:web.xml文件中,配置一個核心的servlet

1.在這之前要先拷貝jar包spring-framework-3.2.0.RELEASE,每一個特定jar包有三個(jar,文檔,源碼),真正的mvc包是spring-webmvc包。

<servlet>

    <servlet-name>springMVC</servlet-name>

    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

    <!--配置上就可以改變配置文件的讀取路徑-->

    <init-param>

        <param-name>contextConfigLocation</param-name>

        <param-value>classpath*:config/spring-servlet.xml</param-value>

    </init-param>

    <!--tomcat容器一啓動,servlet就初始化,攔截所有請求-->

    <load-on-startup>1</load-on-startup>

</servlet>

<servlet-mapping>

    <servlet-name>springMVC</servlet-name>

    <url-pattern>/</url-pattern>

</servlet-mapping>

框架有配置文件,springmvc框架就是springMVC-servlet.xml

springMVC-servlet.xml配置文件默認要放web-inf目錄下。代碼如下:

<beans xmlns="...>

    <!--視圖解析器-->

    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">

        <property name="prefix" value="/"></property>

        <property name="suffix" value=".jsp"></property>

    </bean>

    <!--配controller-->

    <bean name="/test1/helloworld" class="com.tgb.web.controller"></bean>

</beans>

import org.springframework.web.servlet.mvc.Controller;

public class HelloWorldController implements Controller{

    public ModelAndView handleRequest(HttpServletRequest req,

            HttpServletResponse res)throws Exception{

        return new ModelAndView("/welcome");

    }

}

再建立一個welcome.jsp在根目錄就可以做測試了。

啓動報錯,1.有可能是缺乏commons-logging.jar,

         2.配置文件的名字錯了,應爲springMVC-servlet.xml

可以發請求測試了。localhost:8080/springMVC1/test1/helloworld

例子2:

public class HelloWorldController implements Controller{

    public ModelAndView handleRequest(HttpServletRequest req,

            HttpServletResponse res)throws Exception{

        String hello = "1sh hello提高班";

        return new ModelAndView("/welcome","result",hello);

    }

}

頁面是:${result}

例子3:

public class HelloWorldController implements Controller{

    public ModelAndView handleRequest(HttpServletRequest req,HttpServletResponse res)throws Exception{

        Map<String,Object> map = new HashMap<>();

        map.put("map1","提高班1");

        map.put("map2","提高班2");

        return new ModelAndView("/welcome","map",map);

    }

}要引入jstl的jar包和standard.jar包

頁面是:

<c:forEach items="${map}" var="m">

    ${m.key}  --> ${m.value}

</c:forEach>

例子4:一個Controller多個方法

public class MultiController extends MultiActionController{

    public ModelAndView add(HttpServletRequest req,HttpServletResponse res){

        return new ModelAndView("/multi","method","add");

    }

    public ModelAndView update(HttpServletRequest req,HttpServletResponse res){

        return new ModelAndView("/multi","method","update");

    }

}

要在spring-servlet.xml文件裏配置:

<!--參數解析器,跟請求有關,可決定請求到控制器後調哪個方法-->

<bean id="paramMethodResolver" class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">

    <property name="paramName" value="action">

</bean>

<!--配置寫好的controller-->

<bean name="/test1/multi" class="xxx.MultiController">

    <property name="methodNameResolver">

        <ref bean="paramMethodResolver"/>引用剛纔寫的

    </property>

</bean>

可以發請求測試了。

localhost:8080/springMVC2/test1/multi?action=add

localhost:8080/springMVC2/test1/multi?action=update

如果報錯,可能是方法少了HttpServletRequest req,HttpServletResponse res

---------------------------------------------------------------------

圖片的訪問

1.在根目錄建文件夾img,並把圖片拷貝到這裏。

2.jsp頁面上:<img alt="圖片" src="../img/a.png">

例子5:

public class MultiController extends MultiActionController{

    public ModelAndView img(HttpServletRequest req,HttpServletResponse res){

        return new ModelAndView("/staticFile");

    }

}

配置bean及配置靜態資源訪問(不攔截)

<mvc:resources location="/img/" mapping="/img/**"/>

<mvc:resources location="/js/" mapping="/js/**"/>

<bean name="/test1/img" class="xxx.MultiController">

    <property name="methodNameResolver">

        <ref bean="paramMethodResolver"/>引用剛纔寫的方法解析器

    </property>

</bean>

---------------------------------------------------------------------

使用註解方式的配置

springAnnotation-servlet.xml文件:

<!--包掃描-->

<context:component-scan base-package="com.tgb.web.controller.annotation"></context:component-scan>

<!--開啓註解需要這兩個bean-->

<bean class="org.springframework.web.servlet.mvc.AnnotationMethodHandlerAdapter"></bean>

<bean class="org.springframework.web.servlet.mvc.DefaultAnnotationHandlerMapping"></bean>

@Controller

public class UserController{

    @RequestMapping(value="/user/addUser",method=RequestMethod.GET)

    public ModelAndView addUser(){

        String result = "this is addUser----";

        return new ModelAndView("/annotation","result",result);

    }

    @RequestMapping(value="/user/delUser",method=RequestMethod.GET)

    public ModelAndView delUser(){

        String result = "this is delUser----";

        return new ModelAndView("/annotation","result",result);

    }

}

說明:按照上面的寫法,請求  項目名/user/addUser會跳到annotation.jsp頁面。

對於method=RequestMethod.GET或者POST,比較是嚴格的,不對應的請求是不會有效果的。

---------------------------------------------------------------------

註解的優化

1.開啓註解可以用<mvc:annotation-driven/>代替

2.當各個方法的請求url開頭部分都相同的時候,可以合併在類上加註解。

類上RequestMapping(value="/user2"),方法就可以寫RequestMapping(value="/addUser"),

相當 @RequestMapping(value="/user/addUser")

3.想把數據傳遞到頁面可以用request.setAttribute("result",result);[要在方法的參數列表上加HttpServletRequest request]

4.get或者post方式不區分,可把  method=RequestMethod.GET  刪掉

5.控制器返回值可以用字符串:return "/jquery";

前方式是:return new ModelAndView("/jquery","result",result);(返回頁面及傳參)

---------------------------------------------------------------------

參數傳遞

<script type="text/javascript" >

    function addUser(){

        var form = document.forms[0];//注意這裏是forms

        form.action="/springMVC6/user/data/addUser";

        form.method="get";

        form.submit();

    }

</script>

<form action="">

    姓名:<input type="text" name="userName"/>

    年齡:<input type="text" name="age"/>

    <input type="button" value="添加" onclick="addUser()"/>

</form>

@Controller

@RequestMapping("/user/data")

public class DataController {

    @RequestMapping("/addUser")

    public String addUser(String userName,String age,HttpServletRequest request){

        request.setAttribute("userName",userName);

        request.setAttribute("age",age);

        return "/userManager";

    }

}

說明:參數跟表單的name屬性對應,就能接收到。

顯示頁面:

姓名是:${userName}

年齡是:${age}

說明:亂碼是常見的。解決方法:server.xml裏在<Connector connectionTimeout="20000"...>這行加上URIEncoding="UTF-8"

---------------第9講---------------

$(function(){

    $("#add").click(function(){

        var userName = $("#userName").attr("value");

        var age = $("#age").attr("value");

        var user = {userName:userName,age:age};

        $.ajax({

            url:"/springMVC6/user/data/addUserJson",

            type:"get",

            data:encodeURI(user),

            success:function(data){

                alert("userName-->"+data.userName);

            },

        });

    });

});

    @RequestMapping("/addUserJson")

    public String addUserJson(User user,HttpServletRequest request){

        request.setAttribute("userName",user.getUserName());

        request.setAttribute("age",user.getAge());

        return "/userManager";

    }

圖片路徑的注意點:

當類的路徑配置是"/user/data"時,圖片路徑是../xxx的話,上一級目錄就是user,不會返回到項目的根目錄,

所以js引入路徑最好是寫src="/項目名/js/xxx"

---------------第10講---------------

    @RequestMapping("/addUserJson")

    public String addUserJson(User user,HttpServletRequest request){

        String result = "{\"userName\":\""+user.getUserName()+"\",\"age\":\""+user.getAge()+"\"}";

        PrintWriter = null;

        response.setContentType=("application/json");

        try{

            out = response.getWriter();

            out.write(result);

        }catch(IOException e){

            e.printStackTrace();

        }

    }

拿json數據後臺要out.write(),前臺用jQuery的success回調函數就能拿結果function(data){}

---------------第11講---------------

上傳文件解析器配置

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">

    <property name="defaultEncoding" value="utf-8"/>

    <property name="maxUploadSize" value="123412344"/>

    <property name="maxInmemorySize" value="40960"/>

</bean>

<form name="userForm" action="" enctype="multipart/form-data">

     選擇文件:<input type="file" name="file">

     <input type="submit" value="上傳">

</form>

說明:上傳enctype屬性必須爲multipart/form-data

少了兩個上傳文件的jar包,要拷貝。

另外文件上傳<form ../>必須採用method="post"方式

---------------第12講:上傳文件---------------

說的那個接口的方法用name屬性的值

@RequestMapping("/upload2")

public void upload2(HttpServletRequest request,HttpServletResponse response){

    CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext());

    if(multipartResolver.isMultipart(request)){

        MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest)(request);

        Iterator<String> iter = multiRequest.getFileNames();

        while(iter.hasNext()){

            MultipartFile file = multiRequest.getFile((String)iter.next());

            if(file != null){

                String fileName = "demoUpload" + file.getOriginalFilename();

                String path = "D:/" + fileName;

                File localFile = new File(path);

                file.transferTo(localFile);

                file.getInputStream();

            }

        }

    }

}

儘量不用springmvc配置上傳大小,在客戶端驗證,減少服務器壓力。

---------------第13講:與spring集成---------------

struts2和spring集成關鍵點:

1.struts.xml文件中,<struts>標籤裏,<constant name="struts.objectFactory" value="spring"></constant>

說明:如果不用spring管理bean,要寫包名+類名,有spring後寫bean的id即可。

2.

沒有聲音

---------------第14講:與spring集成2---------------

@Controller

public class SpringController{

    @Resource(name="springManager")

    private ISpring springManager;

    @RequestMapping("/spring/get")

    public String get(){

        springManager.get();

        return "/success";

    }

}

---------------第15講:與spring上下文關係---------------

//spring的上下文

WebApplicationContext ac1 = WebApplicationContextUtils.getWebApplicationContext(request.getSession().getServletContext());

//springMVC的上下文

WebApplicationContext ac2 = RequestContextUtils.getWebApplicationContext(request);

ISpring springManager = (ISpring)ac1.getBean("springManager");

在一個配置文件裏寫bean很臃腫,spring可以導入配置文件。

<import resource="classpath*:com/tgb/..."/>

---------------第16講:與hibernate簡單實例---------------

- hibernate五大對象

Configuration

sessionFactory

Session

Transaction

Query和criteria

<property name="configLocations">

    <list>

        <value>classpath*:com/tgb/.../hibernate.cfg.xml</value>

    </list>

</property>

hibernate.cfg.xml裏是這樣:

<hibernate-configuration>

    <session-factory>

        <mapping class="com.tgb.web.controller.entity.User"/>

    </session-factory>

</hibernate-configuration>

public class User{

    @Id

    @GeneratedValue(generator="system-uuid")

    @GenericGenerator(name="system-uuid",strategy="uuid")

    private String id;

}

---------------第18講:與hibernate簡單實例---------------

需配置事務bean:

<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">

    <property name="sessionFactory" ref="sessionFactory"></property>

</bean>

說明:事務管理哪個sessionFactory,可在裏面指定

配置事務特性描述(策略):

<bean id="transactionBase" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" lazy-init="true" abstract="true">

    <property name="transactionManager" ref="transactionManager"></property>

    <property name="" ref=""></property>

    <property name="transactionAttributes">

        <prop key="add*">PROPAGATION_REQUIRED,-Exception</prop>

        <prop key="update*">PROPAGATION_REQUIRED,-Exception</prop>

        <prop key="insert*">PROPAGATION_REQUIRED,-Exception</prop>

        <prop key="modify*">PROPAGATION_REQUIRED,-Exception</prop>

        <prop key="delete*">PROPAGATION_REQUIRED,-Exception</prop>

        <prop key="get*">PROPAGATION_NEVER</prop>

    </property>

</bean>

---------------第19講:整合簡單實踐---------------

public interface IUserDAO{

    public void addUser(User user);

}

public class UserDAO implements IUserDAO{

    public void addUser(User user){

    }

}

另一教程

---------------------------------------------------------------------

核心原理

- 用戶發送請求給服務器。

- 服務器接收到請求。發現DispacherServlet可以處理,於是調用DispacherServlet。

- DispacherServlet內部,通過HandleMapping用於檢查一個url有沒有對應的控制器。如果有,則調用,沒則報404.

- 控制器開始執行。

- 控制器執行完畢後,如果返回字符串,則ViewResolver將字符串轉化成相應的視圖對象;

      如果返回ModelAndView對象,該對象本身就包含了視圖對象信息。

      即改成return new ModelAndView("index");

- DispacherServlet將執行視圖對象中的數據,輸出給服務器。

- 服務器將數據輸出給客戶端。

注意:ModelAndView是web.servlet.ModelAndView包的

HandlerMapping

BeanNameUrlHandlerMapping

ModelAndView

-- 常用註解

- @Controller

在類上面加 @Component和 @Controller是等價的,表明是控制器。

- @RequestMapping

    形式一:在類前面定義,則將url和類綁定。具體調哪個方法呢?需要url裏邊攜帶一個參數,如:

             @RequestMapping(params="method=reg")

    形式二:在方法前面定義,則將url和類的方法綁定。

- @RequestParam 

比如有這樣的一種情況,提交的表單的<input type="text" name="uname"/>,

但是控制器的方法是public String reg3(String name){},

用於加在方法參數的前面,當提交的參數的name屬性值跟參數不一致時,就可以加。

       public String reg3( @RequestParam("uname") String name){//提交表單的name屬性值是uname

            ....

       }

       說明:加 @RequestParam("uname")的意思就是把表單的屬性值爲uname所提交的數值賦值給name這個參數。

- @SessionAttributes({"u","a"})

說明:在某方法裏如果想使用ModelMap,在方法的參數列表里加: ,ModelMap map 就可以(會自動注入);

                如果想使用HttpServletRequest req,在方法的參數列表里加: ,HttpServletRequest req

        從而req.getSession().setAttribute("x","xxx");

map.put("a","aaa");-->頁面上${RequestScope.a}

在類上加了這個註解後,key爲u和a也會在session裏存一份。

- @ModelAttribute

這個註解可以跟 @SessionAttributes配合在一起用。可以將ModelMap中屬性的值通過該註解自動賦給指定變量。

public String reg5( @ModelAttribute("u") String uname,ModelMap map){}

說明:這裏有個uname參數,uname我不需要表單給我參數,我直接把ModelMap裏的屬性key爲u的值直接給我賦過來。

請求轉發與重定向

轉發   return "forward:user.do?method=reg";不寫也是轉發

重定向 return "redirect:http://www.baidu.com";

modelAndView.setViewName("index");

User u = new User("jack");

modelAndView.addObject("uu",u);//較好用

return modelAndView;

頁面上${requestScope.uu.uname}

<!-- JSP 視圖解析器 -->

<bean

    class="org.springframework.web.servlet.view.InternalResourceViewResolver">

    <property name="viewClass"

        value="org.springframework.web.servlet.view.JstlView" />

    <property name="prefix" value="/modules/" />

    <property name="suffix" value=".jsp" />

    <property name="order" value="3" />

</bean>

/IMPM/WebContent/modules/saleManagement/earlyWarningManagement/earlyWarningManageDetail.jsp

-----------------------------------------------------------------

要讓? @Autowired?起作用必須事先在?Spring?容器中聲明AutowiredAnnotationBeanPostProcessor?Bean

<!--?該?BeanPostProcessor?將自動起作用,對標註 @Autowired?的?Bean?進行自動注入?-->?

<bean?class="org.springframework.beans.factory.annotation.?????????AutowiredAnnotationBeanPostProcessor"/>

當不能確定Spring容器中一定擁有某個類的bean時,可以用 @Autowired(required?=?false),這等於告訴?Spring:在找不到匹配?Bean?時也不報錯

我們在?Spring?容器中配置了兩個類型爲?Office?類型的?Bean,當對?Boss?的?office?成員變量進行自動注入時,Spring?容器將無法確定到底要用哪一個?Bean,因此異常發生了。?Spring?允許我們通過?@Qualifier?註釋指定注入?Bean?的名稱,這樣歧義就消除

@Resource作用相當於 @Autowired, @Resource默認按byName自動注入。如果使用name屬性,則使用byName的自動注入策略;而使用type屬性時則使用byType自動注入策略。

要讓JSR-250的註釋生效,除了加這些註釋外,還需要在Spring容器中註冊一個負責處理這些註釋的BeanPostProcessor:

<bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor"/>

標註了 @PostConstruct的方法將在類實例化後調用,而標註了 @PreDestroy的方法將在類銷燬之前調用。

@Component 註解的類就相當於xml配置文件裏定義的bean。默認情況下通過 @Component定義的Bean都是singleton的,如果需要使用其它作用範圍的Bean,可通過 @Scope 來達到目標。

==================第二套====================

- mvc在b/s系統下的應用,c控制器,m模型(pojo,action,service,dao),v視圖

mvc是一個設計模式.

處理器映射器是幹嘛的,是根據url找到對應的處理器。

處理器適配器去執行Handler。

第一步:發起請求到前端控制器DispatcherServlet

第二步:前端控制器查找Handler(可根據xml配置、註解進行查找)

第三步:處理器映射器HandlerMapping向前端控制器返回Handler(其實返回一個執行鏈)

第四步:前端控制器調用處理器適配器去執行Handler

第五步:處理器適配器去執行Handler

第六步:Handler執行完成,給適配器返回ModelAndView

第七步:處理器適配器向前端控制器返回ModelAndView(框架底層對象)

第八步:前端控制器請求視圖解析器去進行視圖解析。

第九步:視圖解析器向前端控制器返回view

第十步:前端控制器進行視圖渲染(將模型數據填充到request域中)

第十一步:前端控制器向用戶響應結果

組件:

1.前端控制器DispatcherServlet

作用:接收請求,響應結果,相當於轉發器。

2.處理器映射器

作用:根據請求的url查找Handler。

3.處理器適配器

作用:按照特定的規則去執行Handler

注意:編寫Handler時按照HandlerAdapter的要求去做,這樣適配器纔可以去正確執行Handler。

4.視圖解析器View resolver

作用:進行視圖解析,根據邏輯視圖名解析成真正的view

5.視圖view

view是一個接口,實現類支持不同的view類型(jsp,freemarker,pdf...)

- 配置前端控制器(web.xml文件)

<servlet>

    <servlet-name>springmvc</servlet-name>

    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

    <!--指定加載位置(配置處理器映射器、適配器)

    不配置contextConfigLocation,默認加載/WEB-INF/servlet名稱-servlet.xml-->

    <init-param>

        <param-name>contextConfigLocation</param-name>

    <param-value>classpath:springmvc.xml</param-value>

    </init-param>

</servlet>

<servlet-mapping>

    <servlet-name>springmvc</servlet-name>

    <url-pattern>*.action</url-pattern>

</servlet-mapping>

接下來要在springmvc.xml裏配置 1.處理器映射器 2.處理器適配器 3.視圖解析器 

注意:多個映射器可以並存,前端控制器判斷url能讓哪些映射器映射,就讓正確的映射器處理。

<!--配置handler-->

<bean name="/queryItems.action" class="cn.itcast.ssm.controller.ItemsController1"/>

<!--處理器映射器(非註解)

將bean的name作爲url進行查找,需要在配置Handler時指定beanname(就是url)-->

<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>

<!--處理器適配器(非註解)-->

<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>

<!--視圖解析器-->

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"></bean>

這時java代碼是:

public class ItemsController implements Controller

request.setAttribute("itemsList",itemsList);

//視圖

request.getRequestDispatcher("/WEB-INF/jsp/items/itemsList.jsp").forward(request,response);

好處是可以響應json數據

===================分隔線===================

<!--另一個非註解的適配器-->

<bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"/>

<!--簡單url映射(非註解)-->

<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">

    <property name="mappings">

        <props>

        <prop key="/queryItems1.action">ItemsController1</prop>

        <prop key="/queryItems2.action">ItemsController1</prop>

    </props>

    </property>

</bean>

注意點3.多個映射器可以並存,前端控制器判斷url能讓哪些映射器映射,就讓正確的映射器處理。

非註解的處理器適配器

   org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter

   要求編寫的Handler實現Controller接口

   org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter

   要求編寫的Handler實現HttpRequestHandler接口。

映射器

在spring3.1之前使用org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping註解映射器。

在spring3.1之後使用org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping註解映射器。

適配器

在spring3.1之前使用org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter註解適配器。

在spring3.1之後使用org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter註解適配器。

public class ItemController implements Controller{

    public ModelAndView handleRequest(HttpServletRequest request,HttpServletResponse response) throws Exception{

        //調用service

        List<Items> itemsList = new ArrayList<Items>();

        //填充靜態數據,模擬數據庫

        Items items_1 = new Items();

        items_1.setName("");

        ModelAndView modelAndView = new ModelAndView();

        //相當於request的setAttribute,在jsp頁面可取數據

        modelAndView.addObject("itemsList",itemsList);

        //指定視圖

        modelAndView.setViewName("/WEB-INF/jsp/items/itemsList.jsp");

        return modelAndView;

    }

}

小結:

重點掌握註解的方式。

對標記有@Controller的類中標記有@RequestMapping的方法進行映射。

視圖解析器

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">

    <property name="prefix" value="/WEB-INF/jsp/" />

    <property name="suffix" value=".jsp" />

</bean>

表現層  |

業務層  |-- spring將各層進行整合、事務控制。

持久層  |

第一步:整合dao層。

    使用mapper的掃描器自動掃描mapper接口,在spring中進行註冊。

第二步:整合service層。

    將service接口配置在spring配置文件中。

第三步:

所需要的jar包:

數據庫驅動

log4j包

數據庫連接池包

jstl包

spring

<sql id="query_items_where">

    <if test="itemsCustom!=null">

        <if test="itemsCustom.name!=null and itemsCustom!=''">

            items.name LIKE '%${itemsCustom.name}%'

        </if>

    </if>

</sql>

<select id="findItemsList" parameterType="包名.ItemsQueryVo" resultType="ItemsCustom">

    SELECT items.* FROM items

    <where>

        <include refid="query_items_where"></include>

    </where>

</select >

/**商品包裝對象*/

public class ItemsQueryVo{

    private Items items;//商品信息

    private ItemsCustom itemsCustom;

}

/**商品信息的擴展*/

public class ItemsCustom extends Items {

//添加擴展屬性

}

public class Items{

這裏是自動生成的

}

接口

public interface ItemsMapperCustom{

    public List<ItemsCustom> findItemsList(ItemsQueryVo itemsQueryVo)throws Exception;

}

21小節:

url映射

窄化請求路徑

限制請求,配置的是允許的類型。

24小節:

參數綁定默認支持的類型

HttpServletRequest

HttpServletResponse

HttpSession

Model/ModelMap  model是接口,ModelMap是一個接口實現

簡單類型 Integer

pojo

自定義轉換器

跟struts2區別:

1.springmvc將url和controller方法映射,映射成功後springmvc生成一個Handler對象,對象中只包括了一個method,方法執行結束,形參數據銷燬。

2.springmvc可以進行單例開發,並建議使用單例開發,struts2通過類的成員變量接收參數,無法使用單例,只能使用多例。

3.struts2速度慢,在於使用struts標籤,建議使用jstl

springmvc第二天

複習

DispatcherServlet 前端控制器:接收request,進行response

接收到請求之後,需要調用一個組件HandlerMapping處理器映射器:根據url查找Handler。(xml配置或者註解)

HandlerAdapter處理器適配器:根據特定規則去執行Handler,編寫Handler時需要按照HandlerAdapter的要求去編寫。

Handler處理器(後端控制器):需要程序員去編寫,常用註解開發方式。

   Handler處理器執行後結果 是ModelAndView(Adapter處理決定的),具體開發時Handler返回方法值類型包括:ModelAndView、

   String(邏輯視圖名)、void(通過在Handler形參中添加request和response,類似servlet開發,可實現json數據輸出)

   View resolver視圖解析器:根據邏輯視圖名生成真正的視圖

   View視圖:jsp頁面,僅是數據展示,沒有業務邏輯。

自定義參數綁定

    定義的Converter<源類型,目標類型>接口

    注意:要轉換的目標類型一定和接收的pojo中的屬性類型一致。

    將定義的Converter實現類注入到處理器適配器中。

學習內容

綁定List

    進入批量修改頁面,批量修改的提交

    使用List接收頁面提交的批量數據,要通過包裝類定義List<pojo>屬性。

綁定Map:同樣通過包裝類,頁面也是定義屬性名,info['name']

- validation校驗

@Size(min=1,max=30,message="{items.name.length.error}",groups={ValidGroup1.class})   校驗組1

private String name;

@NotNull(message="{items.createtime.isNull}")   非空校驗

private Date createtime;

ValidationMessages.properties文件:

items.name.length.error=請輸入1到30個字符

items.createtime.isNull=請輸入生成日期

public String editItemsSubmit(Model model,@Validated(value={ValidGroup1.class}) ItemsCustom itemsCustom,BindingResult bindingResult)throws Exception{

    if(bindingResult.hasErrors()){

        //輸出錯誤信息

    List<ObjectError> allErrors = bindingResult.getAllErrors();

    for(ObjectError objectError:allErrors){

        System.out.println(objectError.getDefaultMessage());

    }

    model.addAttribute("allErrors",allErrors);

    }

}

頁面上:

<c:if test="${allErrors != null}">

    <c:forEach items="${allErrors}" var ="error">

        ${error.defaultMessage}

    </c:forEach>

</c:if>

- 分組校驗

校驗分組接口

public interface ValidGroup1{

}

public interface ValidGroup2{

}

- 數據回顯

@ModelAttribute("items") 可以指定pojo回顯到頁面在request中的key

- JSON交互

1.要求請求的是json串,所以在前端頁面中需要將請求內容轉成json,不方便。

2.請求key/value,輸出json,常用。


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