1.Spring MVC是什么
Spring MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职责解耦,基于请求驱动指的就是使用请求-响应模型,框架的目的就是帮助我们简化开发,Spring MVC也是要简化我们日常Web开发的。另外还有一种基于组件的、事件驱动的Web框架在此就不介绍了,如Tapestry、JSF等。
Spring Web MVC也是服务到工作者模式的实现,但进行可优化。前端控制器是DispatcherServlet;
应用控制器其实拆为处理器映射器 (Handler Mapping)进行处理器管理和视图解析器(View Resolver)进行视图管理;页面控制器/动作/处理器为Controller接口(仅包含ModelAndView
handleRequest(request, response)
方法)的实现(也可以是任何的POJO类);支持本地化(Locale)解析、主题(Theme)解析及文件 上传等;提供了非常灵活的数据验证、格式化和数据绑定机制;提供了强大的约定大于配置(惯例优先原则)的契约式编程支持。
2.SpringMVC的内部调用
URL:localhost:8080/项目名称/addUserServlet
7.将ModelAndView返回给前端控制器
8.前端控制器请求视图解析器解析view
9.视图解析器经过处理 返回一个页面的真实路径 /WEB-INF/addUser.jsp
3.编写Controller
4.配置视图解析器
说明:经过处理器处理返回的是一个view的名称,这时 不能通过名称找到具体的页面路径。所有需要视图解析器做处理
前缀:/WEB-INF/
页面名称 hello
后缀:.jsp
真实路径/WEB-INF/hello.jsp
5.SpringMVC的注解形式
修改配置文件 添加两行注解
<mvc:annotation-driven/> 匹配用户的Url
<context:component-scan base-package="controller"/> 管理对象
说明:使用SpringMVC的注解形式,首先通过@Controller注解管理对应的类。
根据用户提交的URL 与@RequestMapping(value="/hello.action")匹配。如果匹配成功了,则执行该注解下的方法 然后返回一个字符串。这个字符串就是返回页面的名称。这个名称经过视图解析器解析成具体的路径。
6.使用SpringMVC获取参数
在参数列表中,你需要什么样的参数,就写什么
7.1获取Request对象
7.2获取字符串参数
注意:属性的值和页面匹配
7.3封装对象
说明:使用对象赋值时,其中调用的是对象自身的setXXX().所以使用时,需要添加setXXX().
7.4封装日期
如果使用 2017/3/11该日期可以直接转化为Date格式
如果使用 2017-3-11 需要手动转换 否则
//说明:该方法只对当前的Controller有效
@InitBinder
public void InitBinder (ServletRequestDataBinder binder){
binder.registerCustomEditor(
java.util.Date.class,
new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), true));
}
7.5同名提交框
1.如果页面中有同名提交问题,如果接收参数为String,那么参数就会自动的拼接,中间用“,”号隔开。
2.如果同名提交框使用数组接收,那么就会自动的转化为数组格式。
8.解决中文乱码问题,需要再web.xml添加过滤器
9.参数不匹配
如果用户参数列表中写的参数名称和用户页面提交的名称如果不一致。默认情况下,不能正确赋值。
@RequestParam(value="hobby",required=true,defaultValue="敲电脑") String[]hobbys
通过该注解,能够解决参数名称不一致
value="hobby" 必须要与页面中的name属性值一致。
内部将hobby自动转化为 hobbys
required=true/false 是否必须传递该参数
defaultValue="XXX" 默认值,如果没有传递该参数,则添加默认值。
10.重定向和转发
重定向:请求至少2次。传值不能实现。浏览器地址发送改变
redirect:/toUser.action
转发: 发送一次请求 值能够实现传递。浏览器地址不变
forward:/toUser.action
补充:
如果页面放置到WebRoot下,可以通过浏览器直接访问页面,这样做不安全。
为了安全应该将页面放置到WEB-INF下边。这是通过浏览器 将不能直接访问web-inf下的页面。这时只能通过程序内部跳转才能访问。