2.SpringMVC-请求2
2-1 获得请求参数-集合类型参数1
获得集合参数时,要将集合参数包装到一个POJO中才可以
public class VO {
private List<User> userList ;
public List<User> getUserList() {
return userList;
}
public void setUserList(List<User> userList) {
this.userList = userList;
}
@Override
public String toString() {
return "VO{" +
"userList=" + userList +
'}';
}
}
Controller方法
@RequestMapping("/test13")
@ResponseBody
public String test13(VO vo){ //value object
System.out.println("输出接收到的请求参数: ");
System.out.println("------------------------------------------");
for (User user : vo.getUserList()) {
System.out.println(user);
}
return null;
}
<form action="test13" method="post">
用户Id1:<input type="text" name="userList[0].id" />
用户名1:<input type="text" name="userList[0].username" />
性别1:<input type="text" name="userList[0].gender" />
<br>
用户Id2:<input type="text" name="userList[1].id" />
用户名2:<input type="text" name="userList[1].username" />
性别2:<input type="text" name="userList[1].gender" />
<br>
<input type="submit" value="确定">
</form>
当使用ajax提交时,可以指定contentType为json形式,那么在方法参数位置使用@RequestBody可以直接接收集合数据而无需使用POJO进行包装
注意:@RequestBody接受json参数,提交方式一定是post,不能是get
请求的content-type
a.表单post 请求参数对应的content-type
Content-Type:
• application/x-www-form-urlencoded
b. get方式请求 : queryString
c. 文件上传 multipart/form-data
d. ajax请求 数据以json方式提交
application/json;charset=UTF-8
spring-mvc.xml配置静态资源开启
<!--默认的servlet 处理-->
<mvc:default-servlet-handler />
<mvc:annotation-driven>
...
</mvc:annotation-driven>
发送ajax请求的页面
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>
<html>
<head>
<title>Index.jsp</title>
<script src="${pageContext.request.contextPath}/js/axios.min.js"></script>
<script>
function add(){
var userList = new Array();
userList.push({username:"zhangsan",gender:1});
userList.push({username:"lisi",gender:2});
axios.post("test14",userList,{
headers:{"Content-Type":"application/json;charset=UTF-8"}
}).then(function(res){
alert(111)
});
}
</script>
</head>
<body>
<button type="button" onclick="add()">ajax请求</button>
</body>
</html>
处理axios请求的Controller方法
@RequestMapping("/test14")
@ResponseBody //@RequestBody将请求的json对数封装参数对象
public String test14(@RequestBody List<User> userList) {
System.out.println("输出接收到的请求参数: ");
System.out.println("------------------------------------------");
for (User user : userList) {
System.out.println(user);
}
return null;
}
2-3 静态资源访问的开启
三种方式:
方式一: spring-mvc.xml
使用<mvc:default-servlet-handler/>标签
注:如果添加上面的配置,会导致Controller方法失效,必须在配置中添加
<mvc:annotaion-driven >
方式二: [配置类]
<mvc:resources mapping="/js/**" location="/js/"/>
方式三:
在web.xml配置DipatcherServlet--> url-pattern
*.action 或 *.do 只有后缀为指定的action或do才会进入核心控制
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>
2-4 参数绑定注解@RequestParam
@RequestParam 标注在参数,存在的意义: 用于确定参数是否必须有值,是否有默认值,参数名的设置
当请求的参数名称与Controller的业务方法参数名称不一致时,就需要通过@RequestParam注解显示的绑定
@RequestMapping("/test15")
@ResponseBody
public String test15(@RequestParam(name="aaa",required = true,defaultValue = "jack") String name){
System.out.println("接收到参数:"+name);
return null;
}
使用该注解的原则:只要Controller 方法参数名不是单个POJO参数,都要使用@RequestParam
2-5 ResultFul风格参数获取
Restful是一种软件架构风格、设计风格,而不是标准,只是提供了一组设计原则和约束条件。主要用于客户端和服务器交互类的软件,基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存机制等
传统URL: user?opr=getUser&id=1&name=aaa
ResultFul: user/getUser/1/aaa
https://www.ximalaya.com/channel/7/
ResultFul url地址/user/1中的1就是要获得的请求参数,在SpringMVC中可以使用占位符进行参数绑定
http://localhost/spring-demo08-mvc-quickstart/test16/1/jack
@RequestMapping("/test16/{1}/{2}") //使用路径中的占位符{}
@ResponseBody
public String test16(@PathVariable(name="1") Integer id, @PathVariable(name="2") String name){
System.out.println("接收到参数:"+id+","+name);
return null;
}
2-6 自定义类型转换器
SpringMVC自动类型转换的功能 --参数String -->Integer
SpringMVC 默认已经提供了一些常用的类型转换器,例如客户端提交的字符串转换成int型进行参数设置。
但是不是所有的数据类型都提供了转换器,没有提供的就需要自定义转换器,例如:日期类型的数据就需要自定义转换器。
以 String --> Date为例
实现步骤:
step1:定义转换器实现接口Converter<T,S>
public class StringToDateConverter implements Converter<String, Date> {
@Override
public Date convert(String source) {
try {
System.out.println("StringToDateConverter转换器执行了....");
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = sdf.parse(source);
return date;
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
}
step2:注册自定义类型转换器
在spring-mvc.xml配置
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<!--注册 字符串转Date转换器-->
<bean class="com.woniu.converter.StringToDateConverter" />
</set>
</property>
</bean>
<mvc:annotation-driven conversion-service="conversionService">
...
</mvc:annotation-driven>
当然,对于日期格式字符串转换为Date,在实际项目中并不需要定义转换器,直接使用注解实现转换功能
@DateTimeFormat(pattern = "yyyy-MM-dd")
public class User {
private Integer id;
private String username;
private Integer gender;
@JSONField(format = "yyyy-MM-dd") //只针对fastjosn用来转换输出json字符串时生效
@DateTimeFormat(pattern = "yyyy-MM-dd") //针对页面请求参数为日期字符串形式的自动转换
private Date birthday;
...
}
3.SSM整合
XML 配置
1.创建maven-web项目
2. 添加 POM依赖 [三大框架相关jar]
3. 设计项目目录
main
|-java
|-com.woniu.dao
controller
service
|-impl
exception
entity
4. 添加配置文件resources
|-appliatonContext.xml
|- <!-- 配置扫描注解,不扫描@Controller注解-->
<context:component-scan base-package="com.woniu">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" />
</context:component-scan>
|-jdbc.properties
|-mybatis-config.xml [可以没有]
|-spring-mvc.xml
|-<!--包扫描-->
<context:component-scan base-package="com.woniu.controller" />
5. 编写 web.xml
加载初始化参数与spring整合监听器
|-Spring提供了一个监听器ContextLoaderListener就是对上述功能的封装,该监听器内部加载Spring配置文件,创建应用上下文对象,并存储到ServletContext作用域
SpringMVC核心控制器
SpringMVC全局请求字符集过滤器
首页文件
web.xml -->Spring - applicationContext .xml
web.xml -> SpringMVC -> spring-mvc.xml
6.加载页面与静态资源
----------------------------------------------------------------------
7.实现Dao
8.实现 Service
9. 实现 Controller
10.测试首页,及登录功能
applicatonContext.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:tx="http://www.springframework.org/schema/tx"
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/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
<!--<!–开启注解的包扫描–>-->
<context:component-scan base-package="com.woniu">
<!--排除扫描的注解-->
<context:exclude-filter type="annotation"
expression="org.springframework.stereotype.Controller" />
</context:component-scan>
<!--在当前xml文件中加载外部properties配置文件-->
<context:property-placeholder location="classpath:db.properties" />
<!--数据源配置-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.user}" />
<property name="password" value="${jdbc.pass}" />
<property name="initialSize" value="${druid.initialSize}" />
<property name="maxActive" value="${druid.maxActive}" />
<property name="minIdle" value="${druid.minIdle}" />
</bean>
<!--会话工厂Bean-->
<bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
<!--数据源属性的注入-->
<property name="dataSource" ref="dataSource" />
<!--设置类型别名包-->
<property name="typeAliasesPackage" value="com.woniu.entity" />
<!--设置XML - sqlMapper映射文件的路径 如果路径名与Mapper包名一致,则可以省略-->
<!--<property name="mapperLocations" value="classpath:com/woniu/mapper/*.xml" />-->
<!--指定mybatis的核心配置文件-->
<!--<property name="configLocation" value="classpath:mybatis-config.xml" />-->
</bean>
<!--为指定包中的Mapper接口生成代理的子类对象-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!--指定sqlSessionFactoryBean的名称-->
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactoryBean" />
<!--指定数据访问层的包名,将所有该包下的接口生成代理子类对象存入spring容器中-->
<property name="basePackage" value="com.woniu.mapper" />
</bean>
<!--配置事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!--开启注解控制事务 @Transcational-->
<tx:annotation-driven transaction-manager="transactionManager" />
</beans>
spring-mvc.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
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/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!--指定包扫描路径为controller-->
<context:component-scan base-package="com.woniu.controller" />
<!--视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
<!--默认的servlet 处理-->
<mvc:default-servlet-handler />
<!--/js/** 表示js目录及所有的子目录下的所有URL-->
<!--<mvc:resources mapping="/js/**" location="/js/" />-->
<!--类型转换器配置-->
<!--<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">-->
<!-- <property name="converters">-->
<!-- <set>-->
<!-- <!–注册 字符串转Date转换器–>-->
<!-- <bean class="com.woniu.converter.StringToDateConverter" />-->
<!-- </set>-->
<!-- </property>-->
<!--</bean>-->
<mvc:annotation-driven>
<mvc:message-converters>
<!--配置字符串消息转换器-->
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<!--<property name="defaultCharset" value="UTF-8" />-->
<!--设置支持的媒体类型-->
<property name="supportedMediaTypes">
<list>
<value>text/html;charset=UTF-8</value>
</list>
</property>
</bean>
<!--fastjson消息转换器-->
<bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>application/json;charset=UTF-8</value>
</list>
</property>
<!--指定日期格式 WriteDateUseDateFormat - yyyy-MM-dd HH:mm:ss 推荐使用注解 @JSONField -->
<!--<property name="features" value="WriteDateUseDateFormat" />-->
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
</beans>
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<display-name>Archetype Created Web Application</display-name>
<!--全局上下文参数-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<!--该监听器内部加载Spring配置文件,创建应用上下文对象,并存储到ServletContext作用域-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!--配置SpringMVC框架的前端控制器(核心)-->
<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--初始化参数 创建DispatcherServlet实例并调用init()方法时读此配置-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<!--tomcat启动时加载此控制器实例-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!--配置全局过滤的filter-->
<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>
<welcome-file-list>
<welcome-file>login.jsp</welcome-file>
</welcome-file-list>
</web-app>