java框架之springmvc

1、HelloWorld程序

(1)導包:四個spring 核心包(core、beans、context、expression)、一個aop包、兩個 web 包和一個logging 包;html

(2)配置 web xml 就是配置一個 dispatcherServlet,設置開機自啓,指定springmvc配置文件位置(init-param);java

(3)配置springmvc文件,就是一個包掃描和一個視圖解析器(先後綴),還有註解驅動的配置!!!git

(4)寫一個類用@controller 標記,其中的方法用@requestMapping來實現和url 的映射關係;web

(5)出現 classnotfound,idea 環境下打開 projectstructure --problems--fix 便可;ajax

(6)配置文件參考以下:正則表達式

<!--web xml config-->
<servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/dispatcher-servlet.xml</param-value>
    </init-param>
    <!--<load-on-startup>1</load-on-startup>-->
</servlet>
<servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>
<!--springmvc config-->
<!-- 包掃描 -->
<context:component-scan base-package="com.stan.hello"/>
<!-- 靜態資源處理 -->
<mvc:default-servlet-handler />
<!-- springmvc 註解驅動 -->
<mvc:annotation-driven />
<!-- 配置視圖解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
      id="internalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/jsp/" />
    <property name="suffix" value=".jsp" />
</bean>

 

 

2、註解開發

一、@requestMapping 註解

  • 能夠用在方法和類上,起到窄化請求的做用;
  • 其中的屬性還包含 method、param 和 header,都是更加精確請求的做用;
  • @PathVariable 註解指定 url 佔位符(/hello/{name})和方法參數之間的映射;

二、參數相關注解

(1)@RequestParam註解spring

  • 做用就是將請求參數映射到方法參數;
  • 註解有三個屬性:value(請求參數的名字)、required(默認爲true)、defaultValue(請參的默認值);
  • 請求參數名稱和方法參數名稱相同的時候不用設置value的值便可完成映射,不一樣的時候要設置 value 的值爲請求參數的名稱;
  • @RequestHeader 和 @CookieValue 註解:做用就是將請求頭和cookie 的信息映射到方法的參數;註解的屬性和用法都和requestParam 差很少;

(2)請求參數映射到 pojoexpress

  • 保證請求參數的名字和 pojo 的屬性名一致便可自動完成映射,還支持級聯屬性;
  • 名字不一則沒法映射,相應的值爲 null;

(3)方法參數還支持 servlet 的原生 API,支持的類型包括:json

  • request、response、session、Principal
  • InputStream、outputStream、reader、writer

三、目標方法 pojo 類型入參過程

(1)@ModelAttribute註解:cookie

  • 這個註解標記的方法會在每一個目標方法執行前被執行;
  • 修飾目標方法參數:指定 pojo 的鍵名;

(2)pojo 入參過程

  • key 和 pojo 保存在 implicitModel 中,進而保存到 request 中;
  • 第一步先去 implicitModel(map) 中去找,用默認的鍵名去匹配(類名首字母小寫),固然也能夠用 @ModelAttribute 指定鍵名去匹配,找到了就入參;
  • implicitModel 中的 pojo 對象來源於 @ModelAttribute 修飾的方法中存入到 map 中的 pojo 對象;
  • implicitModel 中找不到,當前的 Controller 又用了 @SessionAttributes 註解進行修飾的話,就去 session 中根據相應的鍵名去匹配,找到入參,沒有則拋出異常;
  • 若是沒有 @SessionAttributes 或者鍵值不包括在註解的值裏面的話,則會經過反射來建立一個新的 pojo 對象做爲方法入參;
  • 總結:鍵名----- implicitModel ------session-------(反射生成新對象)-------對象屬性設置爲相應的請求參數的值-------賦值給目標方法的參數

 (3)使用 @sessionAttributes 註解拋出異常的解決方法

  • sessionAttributes 中的名稱和方法參數 modelAttribute 中指定的名稱不一致便可;
  • 要麼就是必須得有 modelAttribute  標記的方法,保證可以取到 sessionAttributes 名稱對應的對象就不會拋異常;
  • 乾脆不用這個註解也能夠;

四、模型數據處理

4.1 方法能夠添加 Map 或者 Model 類型的參數

4.2 方法返回 ModelAndView

  • mv 能夠包含視圖和模型的信息;
  • 最終這些數據都是存放到 request 域中;

4.3 再說 @sessionAttributes

  • 註解的做用:就是將 request 域中的模型數據備份一份到 session,方便不一樣的請求之間共享;
  • 使用時注意:這個註解是類註解,不能修飾方法;既可經過名稱也可經過類型指定放到 session 中的數據(@SessionAttributes(value={"names"},types={Integer.class}));
  • 示例請參考:https://www.cnblogs.com/caoyc/p/5635914.html

五、視圖解析

5.1 視圖解析流程

  • 目標方法不管返回的是 string、model仍是 mv,最終都是包裝成 modelAndView返回;
  • 視圖的做用:渲染模型數據;
  • 視圖解析器的做用:將邏輯視圖轉換爲物理視圖;
  • 經常使用的視圖解析器:BeanNameViewResolver 和 InternalResourceViewResolver;配置多個解析器的話存在優先級的;

5.2 自定義視圖和重定向

  • 自定義視圖:實現view 接口,重寫 render 方法;最後還要在 springmvc 的配置文件中配置beanNameViewresolver,注意解析器的優先級;
  • 轉發和重定向:就是在 return 的 String 中加入前綴 forward: 或者 redirect:
  • view-controller 標籤:view-controller 可實現直接將請求跳轉到視圖,不用通過 controller;

 

3、RESTful風格CRUD

一、CRUD 示例

  • 新增:/order       post
  • 刪除:/order/1    delete
  • 修改:/order/1    put
  • 查詢:/order/1    get

二、發送 put | delete 請求

  • web xml 中配置 HiddenhttpMethodFilter;
  • 表單中增長一個 name=_method  value=delete 或 put 的隱藏域,發送 post 請求;
  • a 標籤的 get 請求轉 post ,js中用return false 阻止 a 標籤默認行爲,再經過 ajax 發送一個 post 請求便可;

三、表單標籤|靜態資源映射配置

3.1 spring 表單標籤

  • 自帶數據的回顯功能;
  • 數據回顯的前提是 form 的 commandName屬性的值要和 request 域中存放的 pojo 對象的鍵值一致;
  • 還支持級聯屬性的寫法;
<form:form action="/mvc/rest/user" method="post" commandName="user">
    編號:<form:input  path="id"/><br>
    姓名:<form:input  path="name"/><br>
    餘額:<form:input  path="balance"/><br>
    <input type="submit" value="提交">
</form:form>
<!-- 若是request中取不到 user ,則會報異常,須要在以前手動加一個 user 進去 -->

3.2 靜態資源映射配置

<mvc:default-servlet-handler></mvc:default-servlet-handler>
<mvc:annotation-driven></mvc:annotation-driven>

四、關於轉發和重定向

  • controller 方法裏 return String 默認是做爲邏輯視圖,要進行 controller 間的轉發或者重定向要在前面加上 forward 和 redirect;
  • 關於轉發和重定向的路徑問題:絕對路徑(/)默認就是在當前的項目下,相對路徑是在當前的controller 內;

 

4、數據處理

一、數據綁定(DataBinder)

(1)基本流程

 

(2)數據轉換:springmvc 內置了不少類型轉換器,通常狀況下不須要咱們本身寫;

(3)自定義類型轉換器

  • 第一步:實現 Converter<S,T>接口,重寫方法實現想要的類型轉換;
  • 第二步:在 spring 的 ioc 容器中配置convertionService;
  • 第三步:mvc:annotion-driven註解中配置 convertionService,將這個註冊到 springmvc 的上下文中;
<mvc:annotation-driven conversion-service="conversionService2"></mvc:annotation-driven>
<!-- myconveter config-->
<bean id="conversionService2" class="org.springframework.context.support.ConversionServiceFactoryBean">
    <property name="converters">
        <set>
            <bean class="com.stan.test.MyConverter"></bean>
        </set>
    </property>
</bean>

(4)關於mvc:annotation-driven

  • 這個標籤會自動註冊RequestMappingHandlerMapping(處理器映射器) 、RequestMappingHandlerAdapter(處理器適配器)、ExceptionHandlerExceptionResolver(異常解析器) 三個bean;
  • 此外還支持配置convertionService,還支持格式化註解(@NumberFormat annotation、@DateTimeFormat)驗證註解(@Valid)請求響應體註解(@RequestBody 和 @ResponseBody)

(5)@InitBinder 註解

  • WebDataBinder 是 DataBinder 的子類,用於完成由表單字段到 JavaBean 屬性的綁定 ;
  • @InitBinder 標識的方法,能夠對 WebDataBinder 對象進行初始化;
  • @InitBinder方法不能有返回值,必須聲明爲void;
  • @InitBinder方法的參數一般是WebDataBinder;
@RequestMapping("object")
@ResponseBody
public String object(User user,Admin admin) {
    return user.toString()+" "+admin.toString();
}

@InitBinder("user")
public void initUser(WebDataBinder binder) {
    binder.setFieldDefaultPrefix("user.");
}

@InitBinder("admin")
public void initAdmin(WebDataBinder binder) {
    binder.setFieldDefaultPrefix("admin.");
}

 

二、數據格式化

(1)使用前提

  • 數據格式化相關的bean:FormattingConversionServiceFactroyBean;
  • <mvc:annotation-driven/> 默認建立的ConversionService 實例即爲FormattingConversionServiceFactroyBean;
  • 若是自定義類型轉換器配置了 conversionService 必定要手動配置 FormattingConversionServiceFactroyBean;
<mvc:annotation-driven conversion-service="conversionService3"/>
<bean id="conversionService3" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
    <property name="converters">
        <set>
            <bean class="com.stan.data.MyConverter"></bean>
        </set>
    </property>
</bean>

 

(2)日期格式化和數值格式化示例(參考:https://www.cnblogs.com/dj-blog/p/7534907.html

@DateTimeFormat(pattern="yyyy-MM-dd")
private Date birth;
@NumberFormat(pattern="#,###,###.#")
private Float salary;

 

三、數據校驗

(1)校驗框架

  • JSR-303(Bean Validation) 是JAVAEE6中的一項子規範,用於 bean 數據合法性校驗;
  • Hibernate Validator 是JSR303的參考實現,提供了 JSR 303 規範中全部內置 constraint 的實現,還有一些附加的 constraint;

(2)能夠實現的校驗

Constraint 詳細信息
@Null 被註釋的元素必須爲 null
@NotNull 被註釋的元素必須不爲 null
@AssertTrue 被註釋的元素必須爲 true
@AssertFalse 被註釋的元素必須爲 false
@Min(value) 被註釋的元素必須是一個數字,其值必須大於等於指定的最小值
@Max(value) 被註釋的元素必須是一個數字,其值必須小於等於指定的最大值
@DecimalMin(value) 被註釋的元素必須是一個數字,其值必須大於等於指定的最小值
@DecimalMax(value) 被註釋的元素必須是一個數字,其值必須小於等於指定的最大值
@Size(max, min) 被註釋的元素的大小必須在指定的範圍內
@Digits (integer, fraction) 被註釋的元素必須是一個數字,其值必須在可接受的範圍內
@Past 被註釋的元素必須是一個過去的日期
@Future 被註釋的元素必須是一個未來的日期
@Pattern(value) 被註釋的元素必須符合指定的正則表達式
Hibernate Validator 獨有的註解  
@Email 被註釋的元素必須是電子郵箱地址
@Length 被註釋的字符串的大小必須在指定的範圍內
@NotEmpty 被註釋的字符串的必須非空
@Range 被註釋的元素必須在合適的範圍內

 

(3)校驗的流程

  • 實現數據校驗的bean:LocalValidatorFactoryBean;
  • annotion-driven 會默認裝配好一個 LocalValidatorFactoryBean;
  • 在對應 pojo 的屬性字段上加上校驗註解;
  • 在處理方法的入參上標註 @valid 註解,入參還能夠加一個 bindingResult的參數;
  • 需校驗的 Bean 對象和其綁定結果對象bindingResult或錯誤對象時成對出現的,之間不容許有其餘參數;
  • 在方法裏獲取校驗的結果(getFieldError、getFieldErrors、getFieldValue、getErrorCount);
  • 在頁面上顯示錯誤( 錯誤信息會隨一個隱含模型傳到jsp,頁面直接用<form:errors path=「userName」>就能夠獲取);
//bean裏面的字段的寫法
@NotEmpty
private String lastName;
//controller方法入參的寫法 @Valid Employee employee,BindingResult bindingResult

 

5、JSON處理--國際化--文件上傳

一、json 處理

1.1 步驟

  • 加入三個 jackson 的 jar(注意 jar 的版本);
  • 寫一個返回值爲 json 對應的對象或集合的目標方法;
  • 在目標方法加上 @responseBody 的註解;
@RequestMapping("/json")
@ResponseBody
public List<User> toJson(){
    User[] users = {new User(1,"k1",100),new User(2,"k2",100)};
    return new ArrayList<>(Arrays.asList(users));
}

1.2 原理(經過 HttpMessageConverter<T> 實現 java對象和json串的相互轉換

1.3 spring提供兩種使用途徑:

  • 使用 @RequestBody(json轉java對象)和 @ResponseBody(java對象轉json)對目標方法進行標註;
  • 使用 HttpEntity<T> 和 ResponseEntity<T> 做爲目標方法的入參或者返回值;

二、國際化

2.1 國際化

​2.1.1 springmvc 配置文件

<!-- 國際化配置 -->
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver"></bean>
<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
    <property name="basename" value="classpath:messages"></property>
</bean>
<mvc:interceptors>
    <bean id="localeChangeInterceptor" class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
        <property name="paramName" value="lang"></property>
    </bean>
</mvc:interceptors>

2.1.2 國際化資源文件

  • messages_zh_CN.properties文件:
language.cn=中文
language.en=英文
welcome=歡迎光臨
  • messages_en_US.properties文件:
language.cn=Chinese
language.en=English
welcome=welcome to my house enjoy yourself

2.1.3 頁面顯示

<h2>國際化測試</h2>
language: <a href="/mvc/rest/locale?lang=zh_CN"><spring:message code="language.cn"></spring:message></a>
<a href="/mvc/rest/locale?lang=en_US"><spring:message code="language.en"></spring:message></a>
<h2><spring:message code="welcome"></spring:message></h2>
locale:${pageContext.response.locale}

2.2 提示消息國際化

  • 建一個國際化properties文件,裏面錯誤的鍵名相似Pattern.user.password,值是要顯示的消息;
  • 在 spring 的ioc 容器裏配置一個 messageSource 註冊國際化資源文件;

2.3 jstlView

  • 項目加入jstl 的jar,springmvc 自動將視圖解析爲 jstlView;
  • 若要使用 jstl fmt 標籤要在 springmvc 的配置文件中配置一個 messageSource;

三、文件上傳

3.1 導入 commons io 和 fileupload 的包;

3.2 IOC 容器中配置 MultipartResolver 實現類;

<!--文件上傳配置-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <property name="defaultEncoding" value="utf-8"></property>
    <property name="maxUploadSize" value="1024000"></property>
</bean>

3.3 controller 目標方法

@RequestMapping("/upload")
public String upload(@RequestParam("file") MultipartFile file){
    if(file != null){
        try {
            file.transferTo(new File("d:\\test\\"+file.getOriginalFilename()));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    return "success";
}

3.4 上傳頁面:必須是post請求,必須設置 enctype

<h1>文件上傳測試</h1>
<form action="/mvc/data/upload" enctype="multipart/form-data" method="post">
    選擇文件:<input type="file" name="file">
    <input type="submit" value="開始上傳">
</form>
</body>

 

6、攔截器使用--異常處理

一、攔截器使用

1.1 攔截器的基本使用

  • 寫一個類繼承 handlerIntercepter,重寫三個方法;
  • 在 spring 中配置本身寫的攔截器;

1.2 攔截器的配置(攔截全部資源和攔截指定資源)

<mvc:interceptors>
    <bean id="localeChangeInterceptor" class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
        <property name="paramName" value="lang"></property>
    </bean>
    <!--攔截全部請求-->
    <bean id="myIntercepter" class="com.stan.intercepter.MyIntercepter"></bean>
    <!--攔截指定請求 這個映射路徑默認是在當前的項目下-->
    <mvc:interceptor>
        <mvc:mapping path="/inter"/>
        <bean id="myIntercepter2" class="com.stan.intercepter.MyIntercepter2"></bean>
    </mvc:interceptor>
</mvc:interceptors>

1.3 攔截器各方法執行時機:HandlerIntercepter#preHandle > HandlerAdapter#handle > HandlerIntercepter#postHandle > dispatcherServlet#render > HandlerIntercepter#afterCompletion

1.4 多個攔截器的執行順序

1.4.1 正常狀況

 

1.4.2 prehandle 有 return false 的狀況:​firstIntercepter#prehandle > secondIntercepter#prehandle(return false) > first#afterCompletion

 

二、異常處理

2.1 Spring 統一異常處理有 3 種方式:使用 @ ExceptionHandler 註解;實現 HandlerExceptionResolver 接口;使用 @controlleradvice 註解;

2.2 使用 @ ExceptionHandler 註解(基於controller)

  • 此方法的侷限性在於拋出異常的方法和處理異常的方法必需要在同一個Controller裏面;
@RequestMapping("/test")
public void test(){
    throw new MyException("haha");
}
@ExceptionHandler({MyException.class})
public String error(){
    return "error";
}

2.3 實現 HandlerExceptionResolver 接口(全局異常處理)

@Component
public class ExceptionTest implements HandlerExceptionResolver {

    @Override
    public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
        ModelAndView mv = new ModelAndView();
        mv.setViewName("error2");
        return mv;
    }
}

2.4 使用 @controlleradvice 註解(全局異常處理)

@ControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler({MyException.class})
    public String error(){
        return "error";
    }
}

 2.5 關於 @ResponseStatus 註解

  • 修飾自定義異常類;
  • 修飾目標方法和異常處理方法均可以;

 

7、springmvc運行流程--和spring整合

一、運行流程

  • 圖片引用自:https://www.cnblogs.com/gxc6/p/9544563.html

二、和spring整合

  • 參考:https://blog.csdn.net/csdn_kenneth/article/details/78781522

三、和 struts2 比較

  • 參考:https://blog.csdn.net/jishuizhipan/article/details/79385190
相關文章
相關標籤/搜索