Spring MVC相關雜項知識記錄-20170326備課筆記

Spring MVC+Spring+JDBC框架搭建

  • 加入jar文件
  • 配置文件
    • Spring配置文件—-applicationContext-jdbc.xml
    • 如果有多個分包,可以分幾句寫
        <context:component-scan package="要掃描的包的絕對路徑" />

    • Spring MVC配置文件—-springmvc-servlet.xml
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    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">
        <!-- 啓動了控制器(controller)的註解功能 -->
        <mvc:annotation-driven></mvc:annotation-driven>
        <!-- 完成Controller返回(return)的邏輯路徑名稱的拼接
        InternalResourceViewResolver:專門用於JSP或HTML路徑解析的 -->
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
                <!-- prefix:前綴
                    之所以要放到WEB-INF下,是爲了提高網站訪問的安全性
                    因爲WEB-INF下的文件無法通過瀏覽器直接訪問
                      -->
                <property name="prefix" value="/WEB-INF/pages/"></property>
                <!-- 後綴不能是.html,只能是.jsp -->
                <property name="suffix" value=".jsp"></property>
        </bean>
        <context:component-scan base-package="cn.worktogether.controller">
                <!-- 由於Spring與Spring MVC均使用同一種方法掃描Bean,將Bean實例化到IoC容器中
                所以,在寫掃描時,注意不要重複掃描!可使用過濾的方式,指定掃描的註解來解決重複掃描問題 -->
                <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
        </context:component-scan>

</beans>

    • web.xml
       <?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>worktogether2</display-name>
  <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>
  <!-- Spring IoC容器的配置文件位置 -->
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:applicationContext.xml</param-value>
  </context-param>
  <!-- log4配置文件位置 -->
  <context-param>
    <param-name>log4jConfigLocation</param-name>
    <param-value>classpath:log4j.properties</param-value>
  </context-param>
  <!-- 用於在項目啓動時加載Spring Ioc容器的監聽器 -->
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
  <!-- 用於啓動log4j的監聽器 -->
  <listener>
    <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
  </listener>
  <!-- SpringMVC啓動的配置 -->
  <servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!-- spring MVC的配置文件讀取 -->
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:springmvc-config.xml</param-value>
    </init-param>
    <!-- 讓服務器啓動時就加載 -->
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <!-- 指定任何請求到這個項目的鏈接首先接給DispatherServlet -->
    <url-pattern>/</url-pattern>
  </servlet-mapping>
  <!-- 解決中文亂碼 -->
  <filter>
    <filter-name>encoding</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>encoding</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>


</web-app>

    • database.properties
driver=com.mysql.jdbc.Driver
#在和mysql傳遞數據的過程中,使用unicode編碼格式,並且字符集設置爲utf-8
url=jdbc:mysql://127.0.0.1:3306/worktogether?useUnicode=true&characterEncoding=utf-8
user=mm
password=123456

    • log4j.properties
##################################################################
#基本配置:輸出等說明
##################################################################
log4j.rootLogger=DEBUG,CONSOLE,File
#log4j.rootLogger=ERROR,ROLLING_FILE
log4j.logger.cn.smbms.dao=debug
log4j.logger.com.ibatis=debug 
log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=debug 
log4j.logger.com.ibatis.common.jdbc.ScriptRunner=debug 
log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=debug 
log4j.logger.java.sql.Connection=debug 
log4j.logger.java.sql.Statement=debug 
log4j.logger.java.sql.PreparedStatement=debug 
log4j.logger.java.sql.ResultSet=debug 
log4j.logger.org.tuckey.web.filters.urlrewrite.UrlRewriteFilter=debug

######################################################################################
# Console Appender  控制檯輸出說明
######################################################################################
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.Threshold=error
log4j.appender.CONSOLE.Target=System.out
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern= [%p] %m %d  - %c%n


######################################################################################
# DailyRolling File  文件輸出說明
######################################################################################
log4j.appender.File=org.apache.log4j.DailyRollingFileAppender
log4j.appender.File.DatePattern=yyyy-MM-dd
log4j.appender.File.File=log.log
log4j.appender.File.Append=true
log4j.appender.File.Threshold=info
log4j.appender.File.layout=org.apache.log4j.PatternLayout
log4j.appender.File.layout.ConversionPattern=%d{yyyy-M-d HH:mm:ss}%x[%5p](%F:%L) %m%n


log4j.logger.com.opensymphony.xwork2=error  
  • 改造DAO層
    • Repository
  • 改造Service層
    • @Service/@Resource
  • 改造Controller層
    • 創建UserController,實現業務功能
  • 改造View層
    • 靜態資源文件
    • 用戶頁面

Spring MVC跳轉

  • 默認爲服務器內的轉發。也可以使用forward:前綴
    • 轉發信息,並非重新請求
  • 如果需要重定向,則在return時加”redirect:”前綴
    • 重新發送URL請求

靜態資源引用(JS,CSS)

  • 方法一:SpringMVC-servlet.xml中加入如下代碼
    • 這樣做的好處在於可以把所有靜態資源都放到WEB-INF文件夾下面
    • 可能需要一個總的文件夾(下面代碼中使用了statics)把所有資源均在下面
<mvc:resources location="/WEB-INF/statics/" mapping="/**" />
  • 方法二:SpringMVC-servlet.xml中加入如下代碼
    • 這樣做的好處在於不用動原來已經存在的靜態資源文件,適合於項目升級改造。
    • 靜態資源不能在WEB-INF下面
    • 需要與聯合使用,否則無效
<mvc:default-servlet-handler/>

異常處理

  • HandlerExceptionResolver
    • resolveException()
  • 局部異常處理
    • 僅能處理指定Controller中的異常
    • @ExceptionHandler(value={RuntimeException.class}),指定在異常處理方法的前面
  • 全局異常處理
    • 對所有異常進行統一處理
    • 配置SimpleMappingExceptionResolver
      • 發生異常時使用對應的視圖報告異常
    <!-- 配置全局異常處理器 -->
        <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
                <property name="exceptionMappings">
                    <props>
                        <!--    指定RuntimeException由叫“error”的邏輯視圖來處理 -->
                        <prop key="java.lang.RuntimeException">error</prop>
                    </props>
                </property>
        </bean>

日期類型轉換

  • Spring MVC沒有字符串與日期類型轉換
    • 報錯:BindingException
    • 在實體類中私有屬性前寫@DateTimeFormat(pattern=”yyyy-MM-dd”)

Spring MVC表單標籤使用

  • 引入標籤庫
    • <%@ taglib prefix=”fm” uri=”http://www.springframework.org/tags/form” %>

Spring MVC常用表單標籤

名稱 說明
表單元素
文本框標籤
密碼框標籤
隱藏框標籤
多行輸入框標籤
單選框標籤
複選框標籤
下拉列表標籤
檢驗對應的錯誤信息

- 標籤
- modelAttribute
- 指定綁定的模型屬性,默認爲command
- action
- 可不指定,會自動應用跳轉過來的路徑爲指定路徑
-
- path:相當於原來的name屬性
- cssClass:對應CSS樣式類名
- cssErrorClass:表彰表單提交後報錯時採用的CSS樣式
- cssStyle:對應style屬性
- htmlEscape:綁定的表單屬性值是否要對HTML特殊字符進行轉換,默認爲true

服務器端的數據校驗

  • JSR303
    • Java爲Bean數據合法性校驗所提供的標準框架
    • Spring MVC支持JSR303
    • JSR303通過在Bean屬性上標註註解來指定校驗規則。
    • Spring本身沒有提供JSR 303的實現
    • 實現者:Hibernate Validator
  • JSR303約束
    • 使用啓動校驗註解
    • 對Controller的處理方法中必須對所聲明的實體類參數標註@Valid,才能實施校驗
    • 在該實體參數後必須跟一個BindingResult的參數,否則直接拋出異常。
    • 然後在jsp頁面進行錯誤信息輸出
    • 錯誤信息使用註解的message屬性進行自定義
Controller的處理代碼如下:
    public String addSave(@Valid Users user,BindingResult err){
        if(err.hasError()){
            return "user/add";
        }
        ...
    }
jsp的處理代碼如下:
    <fm:errors path="userName" />
約束 說明
@Null 被註解的元素必須爲null
@NotNull 被註解的元素必須不爲null
@NotEmpty 被註解的元素不爲null且不爲empty(針對集合)
@NotBlind 被註解的字符串不是Null且被trim後長度不爲0
@AssertTrue 被註解的元素必須爲True
@AssertFalse 被註解的元素必須爲False
@Min(value) 被註解的數字和字符串,其值必須小於等於指定的最小值
@Max(value) 被註解的數字和字符串,其值必須大於等於指定的最大值
@DecimalMin(vlaue) 被註解的元素必須是一個數字,其值必須小於等於指定的最小值
@DecimalMax(value) 被註解的元素必須是一個數字,其值必須大於等於指定的最大值
@Size(min,max) 被註解的集合長度必須在指定的範圍內
@Length(min,max) 被註解的字符串長度必須在指定的範圍內
@Digits(integer,fraction) 被註解的元素必須是一個數字,其值必須在可接受的範圍(integer是整數精度,fraction是小數精度)
@Range(min,max) 檢查數字是否在範圍內
@Past 被註解的Date和Calendar必須是一個過去的日期
@Future 被註解的Date和Calendar必須是一個將來的日期
@Pattern 被註解的字符串符合一個正則表達式
@Email 被註解的字符串符合email格式,如果爲null算通過驗證

REST風格

  • Representational State Transfer,表述性狀態轉移,是一種軟件架構風格
  • 查看/修改/刪除所對應的傳統URL與REST風格的URL對應風格
    • /userview.html?id=12=====>/user/view/12
    • /userdelete.html?id=12====>/user/view/12
  • 請求方式
    • GET
    • POST
    • DELETE
    • PUT
  • Spring MVC提供對REST的支持
    • Controler方法做如下改動
      • @RequestMapping(value=”/view/{id}”)
      • public String add(@PathVariable Integer id)

Spring文件上傳

  • MultipartResolver接口
    • 用於處理上傳請求,將上傳請求包裝成可以直接獲取文件的數據
  • 兩個實現類
    • StandardServletMultipartResolver
      • 使用了Servlet3.0標準的上傳方式
    • CommonsMultipartREsolver
      • 使用了Apache的commons-fileupload來完成具體的上傳操作
  • 實現步驟
  • 服務器端:
配置MultipartResolver(springmvc-config.xml)
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="maxUploadSize" value="5000000" />
        <property name="defaultEncoding" value="UTF-8" />
    </bean>
Controller處理:多文件上傳需要把MultipartFile改爲數組,並在前面加上@RequestParam註解即可,必須加這個註解,否則會報不能實例化數組的錯誤
public String add(@RequestParam(value="imgPath"),required=false MultiPartFile upload,HttpSession session){
    //判斷文件是否爲空
    if(!upload.isEmpty()){
        //獲得文件目標路徑
        String path=session.getServletContext().getRealPath("/upload");
        //獲得原文件名
        String oldFileName=upload.getOriginalFileName();
        //獲得文件後綴
        String suffix=FilenameUtils.getExtension(oldFileName);
        //獲得文件大小
        int fileSize=upload.getSize();
        //創建新的文件名
        String fileName=System.currentTimeMillis()+RandomUtils.nextInt(1000000);
        //創建服務器上的新文件
        File newFile=new File(path,fileName);
        //如果文件不存在,則創建
        if(!newFile.exists()){
            newFile.mkdirs();
        }
        //將上傳的文件保存到磁盤上。
        upload.transferTo(newFile);
    }
}
發佈了293 篇原創文章 · 獲贊 56 · 訪問量 72萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章