1.SpringMVC概述
SpringMVC是一个WEB层,控制层框架,主要用来负责与客户端交互,业务逻辑的调用。SpringMVC是Spring家族的一大组件,Spring整合SpringMVC可以做到无缝集成,特点:简单易用性能佳
2.SpringMVC相对与Servlet的优势
a. Servlet的开发配置相对麻烦,servlet特别多的时候web.xml文件将会非常的臃肿
b. 每个Servlet都只能处理一个功能,如果需要多个功能就需要开发多个servlet,项目中存在大量的servlet显得臃肿。
c. 获取请求参数进行类型转换封装数据到bean的过程比较繁琐。
d. 其他开发中不方便的地方,例如乱码问题,数据格式处理,表单检索
spring MVC详解
- SpringMVC的组件
a. 前端控制器(dispatcherServlet)
本质上是一个servlet,相当于一个中转站,所有的访问都会走到这个servlet中,再根据配置进行中转到相对应的handler中进行处理,获取数据和视图
b. 处理器映射器(HandlerMapping)
本质上就是一段映射关系,将将访问路径和对应的Handler存储为映射关系,在需要时供前端控制器查阅。
c. 处理器适配器(HandlerAdapter)
本质上就是一个适配器,可以根据要求找到对应的handler来运行。前端控制器找到处理器映射器找到对应的handler信息之后,将请求响应和对应的handler信息交由处理器适配器来处理,处理器适配器找到真正的handler执行后,将结果也就是model and view返回给前端控制器。
d. 视图解析器(ViewResolver)
本质上是一种映射关系,可以将视图名称映射到真正的视图地址。前端控制器调用处理器适配完成后的到model和view,将view信息传给视图解析器得到真正的view。
e. 视图(view)
本质上就是将handler处理器中返回的model数据嵌入到视图解析后得到的jsp页面中,向客户端作出响应
生成SpringMvc的核心配置文件
<!--配置前端控制器-->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.dispatcherServlet</servlet-class>
<!--手动配置核心文件的位置-->
<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>*.action</url-pattern>
</servlet-mapping>
<!--配置处理器映射器中的路径和处理器的映射关系-->
<bean name="/hello.action" class="cn.tedu.web.Hello"></bean>
<!--配置视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
//创建类实现controller接口
public class Hello implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
//创建modelAndView
ModelAndView modelAndView = new ModelAndView();
//封装数据
modelAndView.addobject("msg1","hello world");
modelAndView.addobject("msg2","hello springMVC");
//封装视图
modelAndView.setViewName("hello");
//返回modelAndView
return modelAndView;
}
}
SpringMVC注解方式配置
SpringMVC支持使用注解方式配置,比配置文件更加的灵活易用,是目前的主流配置方式
<context:component-scan base-package="cn.tedu"></context:component-scan>
<mvc:annotation-driven></mvc:annotation-driven>
<!--配置视图解析器中视图名称和真正页面的映射关系-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
<!--配置前端控制器-->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.dispatcherServlet</servlet-class>
<!--手动配置核心文件的位置-->
<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>*.action</url-pattern>
</servlet-mapping>
@RequestMapping("/my01")
@Controller
public class Controller01 {
@RequestMapping("/test01.action")
public String test01(Model model){
model.addAttribute("msg","one word one dream");
return "test01";
}
}
springMVC注解工作原理
- 当服务器启动时,会先加载web.xml文件,之后通过引入核心配置文件来加载SpringMVC.xml
- 当解析到包扫描时,扫描指定的包,并将含有@Conteoller注解的类解析为处理器
- 如果配置过mvc:annotation-driven就会解析Spring-MVC注解
- 解析@requestMapping(value=“/test01.action”),将指定的地址和当前方法的映射关系保存
- 当客户端发出请求访问时,SpringMVC寻找改地址的映射关系,找到就执行方法,找不到抛出404
SpringMVC获取请求参数
@Controller
public class MyController01 {
/**
* 获取请求参数:日期数据处理
* 通过注册自定义类型编辑器使SpringMVC支持自定义格式请求参数的处理
* 此处,SpringMVC为Date类型已经提供了编辑器类,所以直接使用,不用自己写
* http://localhost:8080/SpringMVCDay01_04_Params_war_exploded/my01test09.jsp
*/
@InitBinder
public void myInitBinder(ServletRequestDataBinder dataBinder){
dataBinder.registerCustomEditor(Date.class,new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"),true));
}
@RequestMapping("/test09.action")
public void test09(String name, int age, Date birthday) {
System.out.println(name);
System.out.println(age);
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
String format1 = format.format(birthday);
System.out.println(format1);
}
/**
* 获取请求参数:中文乱码解决
* 如果服务器配置的编码是utf-8,且项目采用的也是utf-8则默认请求参数无乱码
* tomcat8默认编码为utf-8(可以更改)
* tomcat7及更老的版本默认编码为iso8859-1(可以更改)
* 如果遇到服务器编码和项目编码不一致时会产生乱码
* 对于POST提交 可以通过request.setCharacterEncoding("utf-8")解决乱码
* 但此行代码对GET无效,GET提交的请求参数乱码,只能手工编解码来解决
* 手工编解码解决乱码的方式对POST提交也有效
* springmvc提供了过滤器CharacterEncodingFilter来帮助我们解决乱码
* 但此过滤器本质上就是request.setCharacterEncoing()所以也是只对POST有效
* ,即使配置了GET提交乱码也要手动解决
*
*/
@RequestMapping("/test08.action")
public void test08(HttpServletRequest request) throws UnsupportedEncodingException {
//POST提交
//request.setCharacterEncoding("utf-8");
//String uname = request.getParameter("uname");
//System.out.println(uname);
//GET提交
//String uname = request.getParameter("uname");
//byte [] data = uname.getBytes("iso8859-1");
//uname = new String(data,"utf-8");
//System.out.println(uname);
}
// 获取请求参数:多个同名请求参数的处理
// http://localhost:8080/SpringMVCDay01_04_Params_war_exploded/my01/test07.action?name=tt&love=bb&love=pp&love=zz
@RequestMapping("/test07.action")
public void test07(String name,String [] love) {
//封装到数组里
System.out.println(name);
System.out.println(Arrays.asList(love));
}
//获取请求参数:自动封装请求参数到bean 对复杂类型的处理
// http://localhost:8080/SpringMVCDay01_04_Params_war_exploded/my01/test06.action?id=35&name=jj&age=18&addr=cd&dog.name=wd&dog.age=1&dog.cat.name=xx&dog.cat.age=3
@RequestMapping("/test06.action")
public void test06(User user) {
System.out.println(user);
}
//获取请求参数:自动封装请求参数到bean 对复杂类型的处理
// http://localhost:8080/SpringMVCDay01_04_Params_war_exploded/my01/test05.action?id=35&name=jj&age=18&addr=cd&dog.name=wd&dog.age=1
@RequestMapping("/test05.action")
public void test05(User user) {
System.out.println(user);
}
//获取请求参数:自动封装请求参数到bean
// http://localhost:8080/SpringMVCDay01_04_Params_war_exploded/my01/test04.action?id=35&name=jj&age=18&addr=cd
@RequestMapping("/test04.action")
public void test04(User user) {
System.out.println(user);
}
//获取请求参数: 通过@RequestParam指定参数赋值,解决请求参数名和方法参数不一致时赋值问题
// http://localhost:8080/SpringMVCDay01_04_Params_war_exploded/my01/test03.action?name=yasuo&uage=19
@RequestMapping("/test03.action")
public void test03(@RequestParam("name") String username, @RequestParam("uage") int age) {
System.out.println(username + "~~~~" + age);
}
//获取请求参数: 直接获取
// http://localhost:8080/SpringMVCDay01_04_Params_war_exploded/my01/test02.action?username=yasuo&age=19
@RequestMapping("/test02.action")
public void test02(String username, int age) {
System.out.println(username + "~~~~" + age);
}
//获取请求参数:传统方式获取
// http://localhost:8080/SpringMVCDay01_04_Params_war_exploded/my01/test01.action?username=yasuo&age=19
@RequestMapping("/test01.action")
public void test01(HttpServletRequest request) {
String username = request.getParameter("username");
int age = Integer.parseInt(request.getParameter("age"));
System.out.println(username + "~~~~" + age);
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。