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">
<mvc:annotation-driven></mvc:annotation-driven>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
<context:component-scan base-package="cn.worktogether.controller">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
</beans>
<?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>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>classpath:log4j.properties</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<listener>
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
<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:springmvc-config.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>
<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>
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.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層
- 改造Service層
- 改造Controller層
- 改造View層
Spring MVC跳轉
- 默認爲服務器內的轉發。也可以使用forward:前綴
- 如果需要重定向,則在return時加”redirect:”前綴
靜態資源引用(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
- 局部異常處理
- 僅能處理指定Controller中的異常
- @ExceptionHandler(value={RuntimeException.class}),指定在異常處理方法的前面
- 全局異常處理
- 對所有異常進行統一處理
- 配置SimpleMappingExceptionResolver
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<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
- 請求方式
- Spring MVC提供對REST的支持
- Controler方法做如下改動
- @RequestMapping(value=”/view/{id}”)
- public String add(@PathVariable Integer id)
Spring文件上傳
- MultipartResolver接口
- 用於處理上傳請求,將上傳請求包裝成可以直接獲取文件的數據
- 兩個實現類
- StandardServletMultipartResolver
- 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);
}
}