SpringMVC泛览
2019-02-26 本文已影响0人
强某某
SpringMVC
-
流程图
图片1.png
使用步骤
- SpringMVC的全局配置文件(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_3_1.xsd"
version="3.1">
<!-- 配置:所有请求由SpringMVC管理 -->
<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- 代表拦截.do结尾的请求 -->
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<!-- 代表拦截/rest/下的所有路由 -->
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
<!-- 配置编码过滤器 -->
<!-- 解决post请求的中文乱码问题,get的中文乱码问题该tomcat的配置,而且tomcat7及之前的才会乱码,之后的默认UTF8编码 -->
<filter>
<filter-name>EncodingFilter</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>EncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
- 基本配置文件 DispatcherServlet-servlet.xml(名称固定,创建在WEB-INF下)
<?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:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.2.xsd">
<!-- 注解配置控制器-->
<!-- 1.配置扫描包,告知spring扫描哪些包下的控制器-->
<context:component-scan base-package="com.zengqiang.backoffice.web.controller"/>
<!-- 2.配置注解处理映射,spring会调用这个处理器,处理器会调用3适配器,然后3处理1中扫描的进行匹配-->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
<!-- 3.配置适配器-->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>
<!-- 4.配置资源视图解析器,其实就是配置jsp这种视图文件的路径-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--前缀-->
<property name="prefix" value="/WEB-INF/views/"></property>
<!--后缀-->
<property name="suffix" value=".jsp"></property>
</bean>
</beans>
- 注解控制器
@Controller
// 添加根路径的注解
@RequestMapping("/user")
public class UserController{
// 该种方式只能POST方法访问,默认都可以
//@RequestMapping(value = "list",method = RequestMethod.POST)
@RequestMapping("list")
public String list(Model model){
//1.模拟数据库的数据
List<User> userList = new ArrayList<User>();
User user1 = new User("习总",60,"男",new Date());
User user2 = new User("李总",50,"男",new Date());
User user3 = new User("上官",18,"男",new Date());
user1.setId(1);
user2.setId(2);
user3.setId(3);
userList.add(user1);
userList.add(user2);
userList.add(user3);
//2.把数据存在model
model.addAttribute("userList",userList);
//这种类型的返回,其实就是WEB-INF下面的views文件夹下面的user文件夹下对应的jsp页面
//而上面的2数据封装到bean,其实就是封装之后给jsp页面使用
return "user/userlist";
}
@RequestMapping("/toRegister")
public String toRegister(){
return "user/register";
}
/**
* 第一种接收表单参数的方式:
* 默认日期格式 月/日/年 10/10/2016
* @return
*/
@RequestMapping("/register")
public String register(String username,String password,
int age,String gender,Date birthday,
String[] hobbyIds){
System.out.println(username);
System.out.println(password);
System.out.println(age);
System.out.println(gender);
System.out.println(birthday);
System.out.println(Arrays.toString(hobbyIds));
return "user/info";
}
/**
* 第二种接收表单参数的方式:
* 默认日期格式 月/日/年 10/10/2016
* @return
*/
@RequestMapping("/register2")
public String register2(User user){
System.out.println(user);
return "user/info";
}
/**
* 第三种接收表单参数的方式:
* @return
* 相当于模型里有模型
*/
@RequestMapping("/register3")
public String register3(UserExt userExt){
//BindingAwareModelMap m;
//此时如果User类产生的对象是UserExt对象的一个属性,则在jsp中使用时候,要user.username这种类似的操作
//否则无法使用
System.out.println(userExt);
return "user/info";
}
//接收集合List类型参数
@RequestMapping("/register4")
public String register4(UserExt userExt){
//BindingAwareModelMap m;
System.out.println(userExt.getUsers());
// 例如UserExt中user是List形式存在,则在jsp中要userlist[0].username形式使用
return "user/info";
}
//接收集合Map类型参数
@RequestMapping("/register5")
public String register5(UserExt userExt){
//BindingAwareModelMap m;
//例如UserExt中有:Map<String ,Object> infos=new HashMap();
//在jsp中使用infos['username']
System.out.println(userExt.getInfos());
return "user/info";
}
@RequestMapping("/edit")
public String edit(int id,Model model){
System.out.println("接收到修改的ID:" + id);
//通过id,查询数据库,返回 一个User对象,把user对象存在model
User user = new User("习总",60,"男",new Date());//假设从数据查
user.setId(1);
model.addAttribute("user",user);
return "user/useredit";
}
//@PathVariable代表路径的id对应参数的id,注意此时的{id}不是参数,是子路由
@RequestMapping("/edit1/{id}")
public String edit1(@PathVariable int id,Model model){
System.out.println("接收到修改的ID:" + id);
//通过id,查询数据库,返回 一个User对象,把user对象存在model
User user = new User("习总",60,"男",new Date());//假设从数据查
user.setId(1);
model.addAttribute("user",user);
return "user/useredit";
}
@RequestMapping("test1")
public String test1(){
//同一个控制器转发,转发到同一个控制器
return "forward:list.do";
}
@RequestMapping("/test1")
public String test1() {
//不同控制器转发
//return "forward:/user/list.do";
//不同控制器重定向
return "redirect:/user/list.do";
}
/**
此时RequestParam针对的是真的参数例如 ?30
* RequestParam参数描述
* value:参数名称
* defaultValue:默认值
* required:参数是否必须有值,如果为true,参数又为空,会报错,如有默认值则会使用默认值,不报错
*
*/
@RequestMapping("/test2")
public String test2(@RequestParam(value = "uid",required = true,defaultValue = "30") Integer uid) {
return "redirect:/user/list.do";
}
}
多试图处理
多视图是一个方法可以返回json/xml等格式的数据
- 导入xml格式支持的jar包
spring-oxm-3.2.0.RELEASE.jar
- 配置支持多视图
<bean
class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
<!-- 配置支持媒体类型 -->
<property name="contentNegotiationManager">
<bean
class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
<property name="mediaTypes">
<map>
<entry key="json" value="application/json"></entry>
<entry key="xml" value="application/xml"></entry>
</map>
</property>
</bean>
</property>
<!-- 指定默认视图 -->
<property name="defaultViews">
<!-- 支持多个视图 -->
<list>
<!-- 对json格式视图支持 -->
<bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView"/>
<!-- xml格式视图支持 -->
<bean class="org.springframework.web.servlet.view.xml.MarshallingView">
<constructor-arg>
<bean class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
<property name="classesToBeBound">
<list>
<!-- 代表哪些类可以支持转换成json或者xml -->
<value>com.zengqiang.backoffice.domain.Student</value>
</list>
</property>
</bean>
</constructor-arg>
</bean>
</list>
</property>
</bean>
- 例如2中com.zengqiang.backoffice.domain.Student是需要处理的pojo对象,务必要提供无参构造方法
而且Student如果是提供返回xml还要加上xmlrootelement注解
ResponseBody和RequestBody
- @ResponseBody把后台pojo转换json对象,返回到页面。
- @RequestBody接受前台json数据,把json数据自动封装javaBean
使用步骤
-
导入json的jar
图2.png -
添加json转换器
在配置文件DispatcherServlet-servlet.xml的3适配器中
图3.png
- java代码处理
@RequestMapping("/register")
//参数中的@ResponseBody将json转换成对象
//public后面的@ResponseBody是将json对象封装成json返回
public @ResponseBody Student test2(@ResponseBody Student stu) {
return stu;
}