專業(yè)邯鄲網(wǎng)站建設(shè)百度識圖軟件
這篇文章包含spring mvc的默認(rèn)數(shù)據(jù)類型綁定和簡單數(shù)據(jù)類型綁定。內(nèi)容來自實(shí)驗(yàn)。
準(zhǔn)備:
(1)在IDEA環(huán)境中從archetye創(chuàng)建webapp類型的maven項(xiàng)目exp6。
(2)在src\main目錄下創(chuàng)建并標(biāo)注java源代碼文件夾和resources資源文件夾。
(3)在pom.xml文件中,添加Spring MVC的相關(guān)依賴。
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc --><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.2.5.RELEASE</version></dependency><!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api --><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version><scope>provided</scope></dependency><!-- https://mvnrepository.com/artifact/org.springframework/spring-context --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.8.RELEASE</version></dependency>
?(4)在resources文件夾下創(chuàng)建配置文件spring-mvc.xml并完成相關(guān)配置。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttps://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd"><!-- 配置創(chuàng)建 springMVC 容器要掃描的包 --><context:component-scan base-package="com.itheima.controller"></context:component-scan><!-- 配置視圖解析器 --><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/pages/"/><property name="suffix" value=".jsp"/></bean>
</beans>
?(5)配置web.xml文件。
<?xml version="1.0" encoding="UTF-8"?>
<web-app><display-name>Archetype Created Web Application</display-name><servlet><servlet-name>DispatcherServlet</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!-- 配置初始化參數(shù),讀取Spring MVC的配置文件 --><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:spring-mvc.xml</param-value></init-param><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>DispatcherServlet</servlet-name><url-pattern>/</url-pattern></servlet-mapping>
</web-app>
?(6)配置Maven啟動項(xiàng)。在pom.xml文件中引入tomcat插件:
<plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.2</version><configuration><port>8080</port><path>/exp6</path></configuration></plugin>
添加Maven啟動項(xiàng),使用命令tomcat7:run啟動應(yīng)用程序。
項(xiàng)目目錄結(jié)構(gòu)如下:
?
?
數(shù)據(jù)綁定:
1.默認(rèn)數(shù)據(jù)類型綁定
在src\main\java文件夾下創(chuàng)建com.itheima.controller的類包,在類包中創(chuàng)建UserController類,在UserController類中定義方法getUserId( ),用于獲取客戶端請求中userid參數(shù)的值。
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;import javax.servlet.http.HttpServletRequest;@Controller
public class UserController {@RequestMapping("/getUserId")public void getUserId(HttpServletRequest request){String userid= request.getParameter("userid");System.out.println("userid="+userid);}
}
啟動項(xiàng)目后,訪問地址http://localhost:8080/exp6/getUserId?userid=2,控制臺打印userid信息如下:
2.簡單數(shù)據(jù)類型綁定
(1)在UserController類中新增getUserNameAndId( )方法,用來接收客戶端請求中的用戶名和id參數(shù)。
@RequestMapping("/getUserNameAndId")public void getUserNameAndId(String username,Integer id) {System.out.println("username="+username+", id="+id);}
?訪問地址http://localhost:8080/exp6/getUserNameAndId?username=Spring&id=1,運(yùn)行結(jié)果如下:
(2)@RequestParam注解來定義參數(shù)的別名,完成請求參數(shù)名稱和處理器的形參名稱不一致時的數(shù)據(jù)綁定。在UserController類中新增getUserName ( )方法,給username形參定義了別名name,同時設(shè)定了請求的name參數(shù)不是必須的,訪問沒攜帶name參數(shù)時會將defaultValue屬性設(shè)定的值賦給形參username。
@RequestMapping("/getUserName")public void getUserName(@RequestParam(value="name", required = false,defaultValue = "itheima") String username){System.out.println("username="+username);}
?訪問http://localhost:8080/exp6/getUserName?name=Spring,運(yùn)行結(jié)果如下:
?(3)使用@PathVariable注解將URL中占位符參數(shù)綁定到處理器的形參中。在UserController類中新增getPathVariable( )方法, value屬性將占位符參數(shù)“name”和處理方法的參數(shù)username進(jìn)行綁定。
@RequestMapping("/user/{name}")public void getPathVariable(@PathVariable(value = "name") String username){System.out.println("username="+username);}
?
(4)POJO綁定:POJO類型的數(shù)據(jù)綁定就是將所有關(guān)聯(lián)的請求參數(shù)封裝在一個POJO中,然后在方法中直接使用該POJO作為形參來完成數(shù)據(jù)綁定。
在src\main\java目錄下,創(chuàng)建一個com.itheima.pojo包,在該包下創(chuàng)建一個User類封裝用戶信息。
public class User {private String username; //用戶名private String password; //用戶密碼public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}
}
?在UserController.java類中,定義registerUser( )方法用于接收用戶注冊信息。
// 接收表單用戶信息@RequestMapping("/registerUser")public void registerUser(User user) {String username = user.getUsername();String password = user.getPassword();System.out.println("username="+username+",password="+password);}
在src\main\webapp目錄下,創(chuàng)建register.jsp文件,編寫用戶注冊表單。
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"><title>注冊</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/registerUser" method="post">用戶名:<input type="text" name="username" /><br />密 碼:<input type="password" name="password" /><br /><input type="submit" value="注冊"/>
</form>
</body>
</html>
啟動后訪問地址http://localhost:8080/exp6/register.jsp,結(jié)果如下:
分別填寫注冊的用戶名和密碼,點(diǎn)擊“注冊”按鈕完成數(shù)據(jù)的提交,控制臺打印信息:
注:輸入的用戶名為中文時,控制臺打印信息可能會出現(xiàn)亂碼,可以使用Spring提供的編碼過濾器來統(tǒng)一編碼,只需要在web.xml中添加如下代碼:
<filter><filter-name>CharacterEncodingFilter</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>CharacterEncodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>
(5)自定義類型轉(zhuǎn)換器:Spring MVC默認(rèn)提供了一些常用的類型轉(zhuǎn)換器,然而默認(rèn)類型轉(zhuǎn)換器并不能將提交的參數(shù)轉(zhuǎn)換為所有的類型。此時需要開發(fā)者自定義類型轉(zhuǎn)換器,來將參數(shù)轉(zhuǎn)換為程序所需要的類型。
①下面演示自定義類型轉(zhuǎn)換器轉(zhuǎn)換特殊數(shù)據(jù)類型并完成數(shù)據(jù)綁定,實(shí)現(xiàn)Date類型的數(shù)據(jù)綁定。
在項(xiàng)目src\main\java目錄下,創(chuàng)建一個com.itheima.convert包,在該包下創(chuàng)建日期轉(zhuǎn)換類DateConverter,并在DateConverter類中定義convert()方法, 實(shí)現(xiàn)String類型轉(zhuǎn)到Date類型的轉(zhuǎn)換。
import org.springframework.core.convert.converter.Converter;import java.text.SimpleDateFormat;
import java.util.Date;public class DateConverter implements Converter<String, Date> {private String datePattern = "yyyy-MM-dd";//定義日期格式@Overridepublic Date convert(String source) {SimpleDateFormat sdf = new SimpleDateFormat(datePattern);try {return sdf.parse(source);} catch (Exception e) {throw new IllegalArgumentException("無效的日期格式,請使用這種格式:"+datePattern);}}
}
還需要在配置文件spring-mvc.xml中配置類型轉(zhuǎn)換器。
<!-- 配置類型轉(zhuǎn)換器工廠 --><bean id="converterService" class="org.springframework.context.support.ConversionServiceFactoryBean"><!-- 給工廠注入一個新的類型轉(zhuǎn)換器,配置自定義類型轉(zhuǎn)換器 --><property name="converters"><array><bean class="com.itheima.convert.DateConverter"/></array></property></bean><mvc:annotation-driven conversion-service="converterService"/>
在UserController.java類中定義方法getBirthday(),用于綁定客戶端請求中的日期數(shù)據(jù)。
/*** 使用自定義類型數(shù)據(jù)綁定日期數(shù)據(jù)*/@RequestMapping("/getBirthday")public void getBirthday(Date birthday) {System.out.println("birthday="+birthday);}
啟動后訪問地址http://localhost:8080/exp6/getBirthday?birthday=2020-11-11,控制臺打印信息:
②上述方法中日期類型的格式轉(zhuǎn)換是基于XML配置自定義轉(zhuǎn)換器實(shí)現(xiàn)的。除了XML方式之外,還可以通過@DateTimeFormat注解來簡化日期類型的格式轉(zhuǎn)換,無需自定義轉(zhuǎn)換器,也無需在配置文件中定義轉(zhuǎn)換器工廠或格式化工廠。
將上述在spring-mvc.xml中配置的轉(zhuǎn)換器工廠和自定義類型轉(zhuǎn)換器都刪除,由于注解方式的類型轉(zhuǎn)換依賴注解驅(qū)動的支持,配置文件中必須顯式定義<mvc:annotation-driven>元素,此時spring-mvc.xml中的代碼如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttps://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd"><!-- 配置創(chuàng)建 springMVC 容器要掃描的包 --><context:component-scan base-package="com.itheima.controller"></context:component-scan><!-- 配置視圖解析器 --><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/pages/"/><property name="suffix" value=".jsp"/></bean><!-- 配置注解驅(qū)動 --><mvc:annotation-driven />
</beans>
修改UserController.java類中getBirthday()方法,修改后的具體代碼如下。
/*** 使用@DateTimeFormat注解綁定日期數(shù)據(jù)*/@RequestMapping("/getBirthday")public void getBirthday(@DateTimeFormat(pattern = "yyyy-MM-dd")Date birthday) {System.out.println("birthday="+birthday);}
啟動項(xiàng)目,訪問http://localhost:8080/exp6/getBirthday?birthday=2020-11-11,控制臺打印信息:
?
復(fù)雜數(shù)據(jù)類型綁定下次再寫。
加油加油^_^