项目文件(SpringMvc1.rar)
springMVC初次学习
SpringMVC 简介
SpringMVC 的执行流程
SpringMVC 的入门案例
SpringMVC 相关配置文件解析
SpringMVC 的参数绑定
SpringMVC 自定义类型转换器
SpringMVC 控制器方法的返回值处理
SpringMVC 的跳转 以及重定向传值
1.springMVC简介
springMVC本身也是基于对servlet进行了封装,也是轻量级的web开发框架之一
从使用角度来说,就是依赖大量的注解,达到传统意思上面MVC的Controller的功效
2.springMVC的执行流程
一个请求匹配前端控制器 DispatcherServlet的请求映射路径(在web.xml中指定),WEB容器将该请求转交给DispatcherServlet * 处理DispatcherServlet 接收到请求后, 将根据请求信息交给处理器映射器(HandlerMapping)
HandlerMapping 根据用户的url请求 查找匹配该url的 Handler,并返回一个执行链
DispatcherServlet 再请求 处理器适配器(HandlerAdapter)调用相应的Handler进行处理并返回ModelAndView给DispatcherServlet
DispatcherServlet 将 ModelAndView 请求 ViewReslover(视图解析器)解析,返回具体 View
DispatcherServlet 对 View 进行渲染视图(即将模型数据填充至视图中)
DispatcherServlet 将页面响应给用户
设计代码,就是所谓的高内聚,低耦合
3.SpringMVC入门
新建项目,并且导入对应的jar包
页面中发起一个同步的请求 hello
在web.xml中
注意解决乱码可以配置/,但是可能会出现不生效的情况,所以建议填写(/*)
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<!-- 处理POST提交乱码问题 -->
<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>
<!-- 前端控制器 -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 不使用 默认找 /WEB-INF/[servlet的名称(springmvc)]-servlet.xml -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
3.1 完善联络关系表 springmvc.xml 在src下
<?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:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.1.xsd">
<!-- 扫描包以其子包下所有类的注解 @Controler @Service等 -->
<context:component-scan base-package="com.wwj"/>
<!-- 注解驱动 -->
<mvc:annotation-driven/>
<!-- 视图解释器 使用前后缀拼接跳转页面路径 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
编写controller层
@Controller
public class HelloController {
@RequestMapping("/hello")
public ModelAndView login(){
//处理业务逻辑
ModelAndView mv = new ModelAndView();
mv.addObject("pOne","wwj");
mv.setViewName("main");
return mv;
}
}
注意:如果在jsp页面使用el表达式,无法取值的话,可以在jsp抬头上面添加<%@ page isELIgnored =”false” %>
4.SpringMVC 相关配置文件解析(了解)
web.xml中添加了init-param 主要是调整我们的配置文件位置加载在src目录下
关于url-pattern常用规则
使用url-pattern配置为 / 拦截所有的请求
使用(.action或者.do) 也就是加一个动作标签
如果使用/* 而我们访问的是一个/xxx.html 或者是 /xxx.jsp 的静态资源。那么拦截了之后,返回对应的设置的value=”/WEB-INF/jsp/” 是无法找到的。
/并不是真正意义上的拦截所有请求,它不会拦截jsp的页面请求,其他的请求则会拦截 /*才是真正意义上的拦截所有请求
5.SpringMVC 的参数绑定的多种方式
分类
接收多个独立的参数
接收简单的对象类型(包含时间处理)
接收复杂的对象类型 (了解)
接收restful形式的参数 (理解)
接收json数据或者是json字符串
接收多个独立的参数
<form action="a1" method="post">
<input type="text" name="a"/>
<input type="text" name="b"/>
<button>提交</button>
</form>
//接收多值的参数
@RequestMapping("/a1")
public void login(@RequestParam(value="a") String a,@RequestParam(value="b") String b){
System.out.println(a+b);
}
接收简单的对象类型(处理时间类型)(参数一一对应)
public class Person implements Serializable{
private int pid;
private String name;
//处理前端传回后端的时间
@DateTimeFormat(pattern="yyyy-MM-dd")
private Date bir;
}
<form action="a2" method="post">
<input type="text" name="pid"/>
<input type="text" name="name"/>
<input type="text" name="bir"/>
<button>提交</button>
</form>
@RequestMapping("/a2")
public void login(Person p){
System.out.println(p.getPid());
System.out.println(p.getName());
System.out.println(p.getBir().toString());
}
参数不一一对应,传回的参数只是实体类熟悉的一部分,前提(名称必须相同)
使用JSONObject对象中的parseObject()方法。(不是用form表单传值,而是用ajax的json字符串传回后端)
@RequestMapping("/addRole")
@ResponseBody
public String addRole(String text,int[] cheboxIds) {
Role role = (Role) JSONObject.parseObject(text, Role.class);
}
注意:如果就只传递类似时间格式的字符串而又不包含的在对象中,可以考虑使用java库处理时间字符串,也可以使用全局的自定义转换器(了解)后续会讲到
接收复杂的对象类型 (了解)
对象中多添加List属性private List dognames;
<form action="a3" method="post">
<input type="text" name="pid"/>
<input type="text" name="name"/>
<input type="text" name="bir"/>
<input type="text" name="dognames[0]"/>
<input type="text" name="dognames[1]"/>
<input type="text" name="dognames[2]"/>
<button>提交</button>
</form>
@RequestMapping("/a3")
public void login2(Person p){
System.out.println(p.getPid());
System.out.println(p.getName());
System.out.println(p.getBir().toString());
System.out.println(p.getDognames().size());
}
接收restful形式的参数 (理解)
何为restful /a4/pname/wwj/ 设计请求的api
<a href="a4/pname/wwj">hellrestful</a>
@RequestMapping(value="/a4/{pnameattr}/{name}")
public void login3(@PathVariable(value="pnameattr") String pnameattr,@PathVariable(value="name") String name){
System.out.println(pnameattr+name);
}
接收json数据或者是json字符串(需要先用到jquery ajax,暂时不设置返回,因为还需额外的jar包进行转换)
暂时先引入: <script src="http://libs.baidu.com/jquery/1.9.1/jquery.min.js"></script>
$(function(){
var user = {
uname : 'wwj',
uage : 18
}
$.ajax({
url: "a5",
type: "post",
dataType:'json',
data: user,
success: function (json) {
}
})
})
//后台接收
@RequestMapping("/a5")
public void login4(@RequestParam("uname") String uname,@RequestParam("uage") String uage){
System.out.println(uname+uage);
}
注意:这种方式不推荐,也就是ajax传递json的字符串,而不是对象,那么需要在ajax中设置 contentType : ‘application/json;charset=utf-8’
赋值参数绑定
直接使用原生的servlet对象以及model(等同于设置到request作用域中)
@RequestMapping("/a6")
public void login5(HttpServletRequest req ,HttpServletResponse resp,Model model){
}
modelView和modelMap不推荐
6.自定义转换类型(处理时间类型)
1.定义转换器
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.springframework.core.convert.converter.Converter;
public class StringToDate implements Converter<String,Date>{
@Override
public Date convert(String arg0) {
// TODO Auto-generated method stub
try {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
Date date = simpleDateFormat.parse(arg0);
return date;
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
}
注解驱动添加
<!-- 注解驱动 -->
<mvc:annotation-driven conversion-service="conversionService"/>
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<bean class="com.wwj.convert.StringToDate"></bean>
</set>
</property>
</bean>
将前面对象属性中提供的注解去掉即可
7.SpringMVC 控制器方法的返回值处理
8.SpringMVC 的跳转 (了解)
如果使用void 采用原生servletAPI中进行请求转发或重定向即可
使用springMVC提供的快捷方式
return “redirect: 资源路径 “;
return “forward: 资源路径 “;
@RequestMapping("/a6")
public String login5(HttpServletRequest req ,HttpServletResponse resp,Model model){
System.out.println(111);
return "redirect: main.jsp";
}
重定向传值(了解,需要借助RedirectAttributes属性)
@RequestMapping("/a6")
public String login5(RedirectAttributes rs){
rs.addAttribute("pname","wwj");
return "redirect: index.jsp";
}
注意观察地址栏的变化
不想参数暴露
@RequestMapping("/a6")
public String login5(RedirectAttributes rs){
//rs.addAttribute("pname","wwj");
rs.addFlashAttribute("pname", "wwj");
return "redirect: index.jsp";
}
然后新的请求接收值的时候 一定使用@ModelAttribute String pname