javascript
SpringMVC框架--学习笔记(上)
1、SpringMVC入門程序:
(1)導入jar包:spring核心jar包、spring-webmvc整合Jar包
(2)配置前端控制器:web.xml文件中
<?xml version="1.0" encoding="UTF-8"?> <web-app id="WebApp_9" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"><display-name>Springmvc_01</display-name><!-- 配置前端控制器 --><servlet><servlet-name>springmvc</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- contextConfigLocation:配置springmvc加載的配置文件(處理處映射器、處理器適配器等等) --><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:springmvc.xml</param-value></init-param> </servlet><servlet-mapping><servlet-name>springmvc</servlet-name><!-- 第一種:*.action,訪問以.action結尾由DispatcherServlet進行解析第二種:/,所有訪問的地址都由DispatcherServlet進行解析,對于靜態文件的解析需要配置不讓DispatcherServlet進行解析,使用此種方法可以實現RESTful風格的url第三種:/*,這種配置不對,使用這種配置,最終要轉發到一個jsp頁面,仍然會由DispatcherServlet解析jsp,不能根據jsp頁面找到Handle,會報錯--><url-pattern>*.action</url-pattern></servlet-mapping><welcome-file-list><welcome-file>index.html</welcome-file><welcome-file>index.htm</welcome-file><welcome-file>index.jsp</welcome-file><welcome-file>default.html</welcome-file><welcome-file>default.htm</welcome-file><welcome-file>default.jsp</welcome-file></welcome-file-list> </web-app>(3)springmvc.xml約束:
(4)配置處理器映射器:
(5)配置處理器適配器:
(6)配置視圖解析器:
(7)配置Handle:
(8)編寫Handle:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> <!-- 非注解:配置Handler作用:將編寫的Handler在spring容器加載<bean id="ItemsController1" name="/queryItems.action" class="com.zwp.controller.ItemsController1"></bean><bean id="ItemsController2" class="com.zwp.controller.ItemsController2"></bean>非注解的處理器映射器第一種:將bean的name作為url進行查找,需要配置Handler是指定beanname(就是url)<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>第二種:簡單url映射<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"><property name="mappings"><props>對ItemsController1進行url映射,url是key的值,ItemsController1是Handler的id值<prop key="/queryItems1.action">ItemsController1</prop><prop key="/queryItems11.action">ItemsController1</prop><prop key="/queryItems2.action">ItemsController2</prop></props></property></bean>非注解的處理器適配器第一種:要求handler實現Controller接口<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>第二種: 要求handler實現HttpRequestHandler接口<bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"></bean> --><!-- 注解方式:配置Handler --><!-- 單個加載方式: --><!-- <bean class="com.zwp.controller.ItemsController3"></bean> --><!-- 批量加載:組件掃描方式: --><context:component-scan base-package="com.zwp.controller"></context:component-scan><!-- 注解的處理器映射器(配對使用)--><!-- <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"></bean> --><!-- 注解的處理器適配器(配對使用) --><!-- <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"></bean> --><!-- 實際使用 mvc:annotation-driven代替上面注解適配器和映射器并且默認加載了很多參數綁定方法,比如json轉化解析器被默認加載了--><mvc:annotation-driven></mvc:annotation-driven><!-- 視圖解析器解析jsp頁面,默認使用jstl標簽,classpath下得有jstl的包 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/jsp/"></property><property name="suffix" value=".jsp"></property></bean> </beans> //編寫Hander:實現controller接口: public class ItemsController1 implements Controller{@Overridepublic ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception { //調用service查詢數據庫,查詢商品列表,這里使用靜態數據List<Items> itemsList=new ArrayList<Items>();Items items1=new Items();items1.setName("鍵盤");items1.setPrice(80.0f);items1.setDetail("機械鍵盤");Items items2=new Items();items2.setName("蘋果手機");items2.setPrice(4000.0f);items2.setDetail("iphone6");itemsList.add(items1);itemsList.add(items2);//返回modelAndViewModelAndView modelAndView=new ModelAndView();//相當于request的setAttribute,在jsp頁面通過itemsList取數據modelAndView.addObject("itemsList", itemsList);//指定視圖modelAndView.setViewName("/WEB-INF/jsp/Items/itemsList.jsp");return modelAndView;}}至此,一個簡單的入門springmvc程序就編寫完成,只需要在網頁訪問響應的地址就可以了,我的訪問地址是:
http://localhost:8080/Springmvc_01/queryItems.action
2、非注解的處理器映射器和適配器:
多個映射器可以共存,前端控制器判斷url能讓哪些映射器處理,就讓正確的映射器處理。
3、注解的處理器映射器和適配器(配對使用):
<!-- 注解的處理器映射器(配對使用)--><!-- <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"></bean> --><!-- 注解的處理器適配器(配對使用) --><!-- <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"></bean> --><!-- 實際使用 mvc:annotation-driven代替上面注解適配器和映射器并且默認加載了很多參數綁定方法,比如json轉化解析器被默認加載了--><mvc:annotation-driven></mvc:annotation-driven>(1)開發Handler:
//@Controller:表明這是一個控制器,不需要實現任何接口 @Controller public class ItemsController3{//使用@RequestMapping注解,實現方法名和url進行映射,一個方法對應一個url//建議方法名和url一樣@RequestMapping("queryItems")public ModelAndView queryItems() throws Exception { //調用service查詢數據庫,查詢商品列表,這里使用靜態數據List<Items> itemsList=new ArrayList<Items>();Items items1=new Items();items1.setName("鍵盤");items1.setPrice(80.0f);items1.setDetail("機械鍵盤123");Items items2=new Items();items2.setName("蘋果手機");items2.setPrice(4000.0f);items2.setDetail("iphone6s");itemsList.add(items1);itemsList.add(items2);//返回modelAndViewModelAndView modelAndView=new ModelAndView();//相當于request的setAttribute,在jsp頁面通過itemsList取數據modelAndView.addObject("itemsList", itemsList);//指定視圖modelAndView.setViewName("Items/itemsList");return modelAndView;} }(2)在springmvc中加載Handler:
<!-- 注解方式:配置Handler --><!-- 單個加載方式: --><!-- <bean class="com.zwp.controller.ItemsController3"></bean> --><!-- 批量加載:組件掃描方式: --><context:component-scan base-package="com.zwp.controller"></context:component-scan>4、視圖解析器:前綴和后綴:
<!-- 視圖解析器解析jsp頁面,默認使用jstl標簽,classpath下得有jstl的包 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/jsp/"></property><property name="suffix" value=".jsp"></property></bean>5、RequestMappering的作用:
(1)用在類上面:窄化url;
(2)用上方法上面:映射url路徑;
(3)用在方法上面:通過method屬性,限制http請求。
6、Controller三種返回值:ModelAndView、String、void:
(1)返回ModelAndView:
? ? 需要在方法結束時,定義ModelAndView,將model和view分別進行設置。
(2)返回String:
? ? 如果controller方法返回String,表示返回邏輯視圖名。真正視圖(jsp路徑)=前綴+邏輯視圖名+后綴。
--redirect從定向:
? ? 特點:瀏覽器地址欄中的url會變化,修改提交的request數據無法傳到重定向地址中。
--forward頁面轉發:
? ? 特點:通過forward進行頁面轉發,瀏覽器地址欄url不變,request可以共享。
(3)void:
在controller方法形參上可以定義request和response,使用request和response指定響應結果:
①使用request轉向頁面,如下:
request.getRequestDispatcher("頁面路徑").forward(request,response);
②通過response頁面重定向:
response.sendRedirect("url");
③也可以通過response指定響應結果,例如響應json數據如下:
response.setCharacterEncoding("utf-8"); response.setContentType("application/json;charset=utf-8"); response.getWriter().write("json串");7、參數綁定:
(1)參數綁定過程:從客戶端請求key/value數據,經過參數綁定,將key/value數據綁定到controller方法的形參上。
?????????springmvc中,接收頁面提交的數據是通過方法形參來接收,而不是像struts2在controller類定義成員變量接收。
(2)默認支持的類型:
? ? 直接在controller方法形參上定義下邊類型的對象,就可以使用這些對象。在參數綁定過程中,如果遇到下邊類型直接進行綁定:
①HttpServletRequest:通過request對象獲取請求信息;
②HttpServletResponse:通過response處理響應信息;
③HttpSession:通過session對象得到session中存放的對象;
④Model/ModelMap:model是一個接口,modelmap是一個接口實現;作用:將model數據填充到request域。
⑤還支持一些簡單類型的參數綁定:通過@PequestParam對簡單類型的參數進行綁定。
如果不使用@PequestParam,要求request傳入的參數名稱和controller方法的形參名稱一致,方可綁定成功。
如果使用@PequestParam,不限制request傳入的參數名稱和controller方法的形參名稱一致。
8、參數綁定:簡單類型的pojo綁定:
頁面中input的name和controller的pojo形參中的屬性名稱一致,將頁面中數據綁定到pojo。
9、自定義參數綁定:
--自定義參數綁定實現日期類型綁定:
對于controller形參中的pojo對象,如果屬性中有日期類型,需要自定義參數綁定。
將請求日期數據串轉成日期類型,要轉換的日期類型和pojo中日期屬性類型保持一致。
(1)springmvc.xml配置文件:
<!--conversion-service="conversionService:注入自定義參數綁定" --><mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven> ?????? <!-- 自定義參數綁定 --><bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean"><!-- 轉化器 --><property name="converters"><list><!-- 日期類型裝換器 --><bean class="com.zwp.ssm.controller.converter.CustomDateConverter"></bean></list></property></bean>(2)自定義的綁定器:
//自定義參數綁定: //實現啊Converter接口,<轉化前格式,轉化后格式>, //轉化后的格式要和接收的pojo中的屬性類屬性一致 public class CustomDateConverter implements Converter<String,Date>{@Overridepublic Date convert(String source) {//自定義日期格式綁定器: SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");try{//轉換成功直接返回return simpleDateFormat.parse(source);}catch(Exception e){e.printStackTrace();}//如果參數綁定失敗,返回nullreturn null;} }10、參數綁定:包裝類型的pojo:
11、參數綁定:數組綁定:
12、參數綁定:list綁定:
通常在需要批量提交數據時,將提交的數據綁定到list<pojo>中,比如,成績錄入(錄入多門成績,批量提交)。
13、參數綁定:Map綁定:
在包裝類中定義Map對象,并添加get/set方法,action使用包裝對象接收。
包裝類中的定義Map對象如下:
14、validation校檢:
項目中,通常使用較多的是前端的校檢,比如頁面中的js校檢。對于安全要求較高點建議在服務端進行校驗。
(1)服務端檢驗:
????? ? 控制層controller,校驗頁面請求的參數的合法性。在服務端控制層controller校驗,不區分客戶端類型(瀏覽器、手機客戶端、遠程調用)。
????? ? 業務層service(使用較多):主要檢驗關鍵業務參數,僅限于service接口中使用的參數。
????? ? 持久層dao:一般不進行校驗。
(2)springmvc校驗:
springmvc使用hibenate的校驗框架(和hibernate沒有任何關系)
校驗思路:頁面提交請求參數,請求到controller方法中,使用validation進行校驗。如果檢驗出錯,將錯誤信息展示到頁面。
步驟:
①導入jar包:
(hibernate-validator.5.x.x和validation-api.1.0.0版本沖突,使用hibernate-validator.4.x.x)
②配置校驗器:(springmvc.xml文件中)
<!-- 校驗器: --><bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"><!-- hibernate校驗器 --><property name="providerClass" value="org.hibernate.validator.HibernateValidator"></property><!-- 指定校驗使用的資源文件,如果不指定則默認使用classpath下的ValidationMessage.properties --><property name="validationMessageSource" ref="messageSource"></property> </bean><!-- 校驗錯誤信息配置文件 --><bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource"><!-- 資源文件名 --><property name="basenames"><list><value>classpath:CustomValidationMessage</value></list></property><!-- 資源文件編碼格式 --><property name="fileEncodings" value="utf-8"></property><!-- 對資源文件內容緩存時間,單位秒 --><property name="cacheSeconds" value="120"></property></bean>(3)檢驗器注入到處理器適配器中:
<!-- validator="validator":注入校驗器 --><mvc:annotation-driven validator="validator"></mvc:annotation-driven>(4)錯誤信息文件:CustomValidationMessage.properties#添加校驗錯誤提交信息 items.name.length.error=請輸入1到30個字符的商品名稱 items.creatime.isNull=生產日期不能為空
(5)在pojo中添加校驗規則:
//在pojo中添加校驗規則 public class Items {private Integer id;//校驗名稱在1-30個字符之間,message是校驗出錯的顯示信息//groups:定義校檢器分組,可以定義多個分組@Size(min=1,max=30,message="{items.name.length.error}",groups={ValidGroup1.class})private String name;private Float price;private String pic;//校驗生產日期不能為空@NotNull(message="{items.creatime.isNull}")private Date creatime;private String detail;}(6)在controller中捕獲錯誤信息:
//商品信息修改提交//在需要校檢的poji前面加上@Validated,在需要校檢的pojo后面加上BindingResult bindingResult接收校檢出錯的信息//Validated和BindingResult必須配對出現,且順序不能改變@RequestMapping(value="/editItemsSubmit",method={RequestMethod.POST,RequestMethod.GET})public String editItemsSubmit(Model model,HttpServletRequest request,Integer id,@ModelAttribute("itemsCustom") @Validated(value={ValidGroup1.class}) ItemsCustom itemsCustom,BindingResult bindingResult,MultipartFile items_pic) throws Exception{if(bindingResult.hasErrors()){List<ObjectError> allErrors=bindingResult.getAllErrors();//自定義一個list接受自己編碼后的提示字符串,在把自己定義的list傳到界面,//這樣就解決了把亂碼傳到界面的問題了List<String> listErrors=new ArrayList<>();for(ObjectError objectError:allErrors){//System.out.println(objectError.getDefaultMessage());//把返回錯誤的提示再次編碼String strError=new String(objectError.getDefaultMessage().getBytes("ISO-8859-1"),"UTF-8"); listErrors.add(strError);//把編碼好的錯誤提示信息加自己定義好list集合里面去}model.addAttribute("allErrors", listErrors);return "Items/editItems";}return "forward:queryItems.action"; }(7)在頁面中顯示錯誤信息:
15、validation分組檢驗:
每個controller方法需要不同的校驗。
解決方法:定義多個校驗分組(其實是一個java接口),分組中定義有哪些規則,每個controller方法使用不同的校驗分組。
(1)創建分組接口類:
public interface ValidGroup1 {//接口不需要定義任何方法,僅是對不同的校驗規則進行分組//此分組只對商品名稱長度進行校驗}(2)定義分組:(使用groups)
(3)在controller指定使用哪個分組:
16、數據回顯:
(1)簡單類型的數據回顯:使用model的方法。
model.addAttribute("id",id);(2)pojo類型的數據回顯:
第一種:默認方式:
pojo數據傳入controller方法后,springmvc自動將pojo數據放到request域,key等于pojo類型(首字母小寫)
第二種:使用@ModelAttribute:指定pojo回顯到頁面在request中的key。
--@ModelAttribute還可以將方法的返回值傳到頁面:
頁面上可以得到itemTypes數據:
第三種:使用model方式:
//可以直接使用model將提交pojo回顯到頁面 model.addAttribute("items",itemsCustom);接下篇:SpringMVC框架--學習筆記(下):https://blog.csdn.net/a745233700/article/details/81045960
總結
以上是生活随笔為你收集整理的SpringMVC框架--学习笔记(上)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mybatis框架--学习笔记(下)
- 下一篇: SpringMVC框架--学习笔记(下)