SpringMVC是spring的一大组件,来代替传统的servlet。首先要明白SpringMVC的调用过程。
SpringMVC调用过程
1.客户发送request请求localhost:8090/SpringMVC/hello.action
2.请求处理器映射器处理handler(找到匹配的Controller类)
3.返回能够处理的那个Controller类
4.请求处理器适配器执行handler(内部按照匹配规则执行)
5.执行handler(Controller-service--dao)
6.将处理结果进行返回,返回ModelAndView对象(model表示处理后的数据 View表示页面的逻辑名称hello)
7.将ModelAndView对象返回给前端控制器
8.请求视图解析器解析View对象(将页面的逻辑名称,拼接成一个完整的页面路径/WEB-INF/hello.jsp)
9.将完整的页面路径再次返回值给前端控制器
10.将model数据填充到页面中的Request域中
Springmvc入门
一、配置文件方式
1导入相关jar包
2 web.xml配置前段控制器
前端控制器实际上就是一个servlet,springMVC的前端控制器就是这个DispatcherServlet。他所在的位置如图:
在Web.Xml中配置这个servlet
这表示所有以”*.action”结尾的请求,都交给DispatcherServlet这个前端控制器,这个前端控制器不是一个class,同样我们可以通过简单的xml配置就可以让这个控制器以及其他的处理器映射器,视图解析器起作用。
3. 配置springmvc的核心配置文件
SpringMVC核心配置文件命名规则
Servlet的name+“-servlet.xml”那么这里就是springmvc-servlet.xml
这个过程也是让处理器映射器起作用
Spring的核心配置文件已经配置好了那个访问路径,需要用那个Controller,下面我们来实现controller
4.实现controller
5. 配置视图解析器
经过这五步后就实现了简单的springmvc的入门。除了用配置文件的方式外Spring还提供了简单的通过注释来实现。
二、注解方式实现
前两步和配置文件相同,但在配置springmvc核心配置文件时。需要开启spring的注解,不用去新加一个bean来映射url和controller的关系。
1 2同上
3 开启springmvc的注解同时配置好视图解析器
4.实现controller
可以直接添加@RequestMapping来说明那个请求用哪个类或哪个方法来处理。
5.注意
@RequestMapping标注在类上表示这个url和子url都在这个类处理,可以用@RequestMapping来标注类和类中的方法
比如:
@RequestMapping(/user)
public class Usercontroller{
@RequestMapping(/users)//表示只有url=“/user/users”时交给这个方法来处理
public String list(Model model){
model.addAttribute(“user”,user);
return “user/list”
}
}
@RequestMapping(/user)
public class Usercontroller{
@RequestMapping(/users)//表示只有url=“/user/users”时交给这个方法来处理
public String list(Model model){
model.addAttribute(“user”,user);
return “user/list”
}
}
三、怎么获取页面参数
一般情况下springmvc可以直接通过形参来获取传递过来的参数
前台传递可以直接get方式?后添加相应参数,或者页面中的name属性的值应该与接收方法的参数名称一致。,比如
四.怎么返回给页面参数
返回参数需要用到Springmvc的model对象用法和map一样,key-value的形式
前台获取也直接用map的方式获取。
@RequestMapping(/user)
public class Usercontroller{
@RequestMapping(/users)//表示只有url=“/user/users”时交给这个方法来处理
public String list(Model model){
model.addAttribute(“user”,user);//添加返回参数到response域中
return “user/list”
}
}
五.几个常见问题
1,解决中文乱码问题
<!--解决中文乱码问题 -->
<filter>
<filter-name>characterEncoding</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>characterEncoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
转发和重定向
1.转发:
1.浏览器的地址不会发生改变
2.转发能够携带参数
forward:/toUser.action 转发的关键字不能错
关键字 url
2.重定向
1.浏览器的地址发生改变
2.重定向不负责传递参数
redirect:/toUser.action
关键字 url
3.同名提交问题
如果遇到同名提交问题,那么如果接收参数为String类型时,那么将会把用户提交的信息拼接成一个字符串,
如果接收的参数为数组时,那么SpringMVC将会把同名提交自动的赋值到数组中。
4.对象封装参数
如果参数个数较多时,可以使用对象进行封装,页面中的name属性的值应该和对象中的属性保持一致,并且set方法不能省略,否则不能正确注入
5.为对象的引用封装参数
SpringMVC能够为对象的引用赋值
-
name属性的值
set()不能省略
如果想进行赋值,必须添加set方法
页面中的name属性的值和参数名称不匹配
其他属性值的用法
@RequestParam(value="state",required=true,defaultValue="长不大的成年人")String sta
Value:页面中的name属性值
required:如果为true则表示必须传递该参数 false表示可以不传
defaultValue:如果该值为null时,那么会添加默认值
6.日期类型的转化
如果想转化日期格式例如 2017-11-11 这时如果不做任何处理那么必然会报400错误 400表示 类型匹配错误
解决方案:自定义日期格式
@InitBinder
publicvoid InitBinder (ServletRequestDataBinder binder){
binder.registerCustomEditor(
java.util.Date.class,
newCustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), true));
}
如果将上述代码配置到Controller中那么当前的controller任意的方法都能够实现日期格式的转化。
如果其他的Controller也需要进行日期格式的转化,那么必须添加上述代码,这时造成了代码的重复。
所以,日期转化工具通常情况下放到基本类中,别的类继承即可。