概述@H_301_2@
SpringMVC不仅提供了Xml的配置方式,还提供了注解的方式来声明一个Controller,本文属于SpringMVC的入门级内容,仅供学习分享使用,如有不足之处,还请指正。
SpringMVC注解优点@H_301_2@
- XML配置起来有时候冗长,此时注解可能是更好的选择。
- 注解最大的好处就是简化了XML配置;其实大部分注解一定确定后很少会改变,在一些中小项目中使用注解反而提供了开发效率。
- 注解相对于XML的另一个好处是类型安全的,XML只能在运行期才能发现问题。
- 采用注解的方式,一个类可以有多个Action。
SpringMVC相关知识点@H_301_2@
- SpringMVC默认采用的是请求转发的跳转方式,不是重定向方式。
- RequestMapping的路径可以和方法名不一致
- PUT/DELETE访问方式,可以采用过滤器(HiddenMethodFilter)的方式进行拦截
SpringMVC支持注解步骤@H_301_2@
1. 配置dispatcher-servlet.xml文件@H_301_2@
1@H_301_2@ <?@H_301_2@xml version="1.0" encoding="UTF-8"@H_301_2@?>@H_301_2@
2@H_301_2@ <@H_301_2@beans @H_301_2@xmlns@H_301_2@="http://www.springframework.org/schema/beans"@H_301_2@
3@H_301_2@ xmlns:xsi@H_301_2@="http://www.w3.org/2001/XMLSchema-instance"@H_301_2@
4@H_301_2@ xmlns:context@H_301_2@="http://www.springframework.org/schema/context"@H_301_2@
5@H_301_2@ xmlns:mvc@H_301_2@="http://www.springframework.org/schema/mvc"@H_301_2@
6@H_301_2@ xsi:schemaLocation@H_301_2@="http://www.springframework.org/schema/beans
@H_301_2@ 7@H_301_2@ http://www.springframework.org/schema/beans/spring-beans.xsd
@H_301_2@ 8@H_301_2@ http://www.springframework.org/schema/context
@H_301_2@ 9@H_301_2@ http://www.springframework.org/schema/context/spring-context.xsd
@H_301_2@10@H_301_2@ http://www.springframework.org/schema/mvc
@H_301_2@11@H_301_2@ http://www.springframework.org/schema/mvc/spring-mvc.xsd"@H_301_2@>@H_301_2@
12@H_301_2@ <!--@H_301_2@ 配置注解的扫描 @H_301_2@-->@H_301_2@
13@H_301_2@ context:component-scan @H_301_2@base-package@H_301_2@="com.hex.second"@H_301_2@></@H_301_2@context:component-scan@H_301_2@14@H_301_2@ 支持MVC的注解 @H_301_2@15@H_301_2@ mvc:annotation-driven @H_301_2@mvc:annotation-driven@H_301_2@16@H_301_2@ 静态资源的支持 @H_301_2@17@H_301_2@ mvc:default-servlet-handler@H_301_2@/>@H_301_2@
18@H_301_2@ </@H_301_2@beans@H_301_2@>@H_301_2@
2. 新建一个类增加方法,并在方法上添加注解@H_301_2@
如下所示,通过@Controller表示一个类,通过@RequestMapping("/Hello")标识一个访问请求处理方法
@Controller
@H_301_2@//@H_301_2@@RequestMapping("/HC")@H_301_2@
3@H_301_2@ public@H_301_2@ class@H_301_2@ HelloController {
@H_301_2@ 4@H_301_2@
5@H_301_2@ /**@H_301_2@
6@H_301_2@ * 通过注解的方式声明Controller,不带参数
@H_301_2@ * @H_301_2@@return@H_301_2@
8@H_301_2@ */@H_301_2@
9@H_301_2@ @RequestMapping("/Hello")
@H_301_2@10@H_301_2@ public@H_301_2@ ModelAndView HelloMvc(){
@H_301_2@11@H_301_2@ ModelAndView mav=new@H_301_2@ ModelAndView();
@H_301_2@12@H_301_2@ mav.addObject("msg","HelloWorld,HelloSpringMVC!!!");
@H_301_2@13@H_301_2@ mav.setViewName("WEB-INF/jsps/HelloWorld.jsp"14@H_301_2@ return@H_301_2@ mav;
@H_301_2@15@H_301_2@ }
@H_301_2@16@H_301_2@ }
3. 新增一个Jsp页面接收并显示内容@H_301_2@
如下所示:通过${msg} 接收后台传递过来的参数
1@H_301_2@ <%@H_301_2@@ page language@H_301_2@=@H_301_2@"@H_301_2@java@H_301_2@ contentType@H_301_2@text/html; charset=UTF-8@H_301_2@"@H_301_2@
2@H_301_2@ pageEncoding@H_301_2@UTF-8@H_301_2@"@H_301_2@%>@H_301_2@
<!@H_301_2@DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"@H_301_2@ 4@H_301_2@ html@H_301_2@ 5@H_301_2@ head@H_301_2@Meta @H_301_2@http-equiv@H_301_2@="Content-Type"@H_301_2@ content@H_301_2@="text/html; charset=UTF-8"@H_301_2@title@H_301_2@>@H_301_2@第一次接触SpringMVCbody@H_301_2@h1@H_301_2@>@H_301_2@欢迎信息11@H_301_2@ >@H_301_2@${msg}12@H_301_2@ 13@H_301_2@ 4. 访问@H_301_2@
打开浏览器,输入网址即可访问,如下所示:

SpringMVC接收页面传递数据的方式(前端-->后端)@H_301_2@
1. 通过方法的参数的方式@H_301_2@
如下所示:SpringMVC能够自动将页面传递的数据和函数的参数匹配起来;
如果是日期格式的数据,需要进行格式化
1@H_301_2@ * 以参数的方式传递获取页面传递过来的值
@H_301_2@@param@H_301_2@ name
@H_301_2@ age
@H_301_2@ date 日期格式,由客户端传递参数到服务端时,需要进行日期格式化,否则会报错
@H_301_2@ * 注解如下:@DateTimeFormat(pattern="yyyy-MM-dd")
@H_301_2@ 9@H_301_2@ @RequestMapping("/Hello2"public@H_301_2@ ModelAndView HelloMvc2(String name,int@H_301_2@ age,@DateTimeFormat(pattern="yyyy-MM-dd")Date date){
@H_301_2@11@H_301_2@ System.out.println("name:"+name);
@H_301_2@12@H_301_2@ System.out.println("age:"+age);
@H_301_2@13@H_301_2@ System.out.println("date"+date);
@H_301_2@14@H_301_2@ ModelAndView mav=15@H_301_2@ mav.addObject("name",name);
@H_301_2@16@H_301_2@ mav.addObject("age"301_2@17@H_301_2@ mav.addObject("date"301_2@18@H_301_2@ mav.setViewName("WEB-INF/jsps/HelloWorld2.jsp"19@H_301_2@ 20@H_301_2@ }
2. 通过对象的方式进行数据的传递@H_301_2@
如下所示,先定义一个User类,来接收页面传递的数据,SpringMVC能自动进行匹配
* 通过对象的方式接收参数,SpringMVC可以自动匹配参数到对象的属性中
@H_301_2@ * 方便扩展
@H_301_2@ user
@H_301_2@ 6@H_301_2@ 7@H_301_2@ @RequestMapping("/Hello3" 8@H_301_2@ ModelAndView HelloMvc3(User user){
@H_301_2@ 9@H_301_2@ System.out.println("name:"+user.getName());
@H_301_2@10@H_301_2@ System.out.println("age:"+user.getAge());
@H_301_2@11@H_301_2@ System.out.println("date"+user.getDate());
@H_301_2@12@H_301_2@ ModelAndView mav=13@H_301_2@ mav.addObject("name"301_2@14@H_301_2@ mav.addObject("age"301_2@15@H_301_2@ mav.addObject("date"301_2@16@H_301_2@ mav.setViewName("WEB-INF/jsps/HelloWorld2.jsp"17@H_301_2@ 18@H_301_2@ }
Jsp页面接收如下所示:以key.property的方式获取内容
>@H_301_2@Hello world>@H_301_2@ID:${user.id}12@H_301_2@ >@H_301_2@姓名:${user.name}13@H_301_2@ >@H_301_2@年龄:${user.age}14@H_301_2@ >@H_301_2@时间:${user.date}16@H_301_2@ 3. 通过内置对象的方式进行数据的传递@H_301_2@
* 通过内置对象HttpServletRequest来获取参数
@H_301_2@ req
@H_301_2@ resp
@H_301_2@ 7@H_301_2@ @RequestMapping("/Hello4" ModelAndView HelloMvc4(HttpServletRequest req,HttpServletResponse resp){
@H_301_2@ 9@H_301_2@ System.out.println("name:"+req.getParameter("name"));
@H_301_2@10@H_301_2@ System.out.println("age:"+req.getParameter("age"11@H_301_2@ System.out.println("date"+req.getParameter("date"12@H_301_2@ 往页面传递参数的一种@H_301_2@
13@H_301_2@ ModelAndView mav=14@H_301_2@ mav.addObject("name",req.getParameter("name"15@H_301_2@ mav.addObject("age",req.getParameter("age"16@H_301_2@ mav.addObject("date",req.getParameter("date"17@H_301_2@ mav.setViewName("WEB-INF/jsps/HelloWorld2.jsp"18@H_301_2@ 19@H_301_2@ }
SpringMVC页面接收参数的方式(后端-->前端)@H_301_2@
1. 采用ModelAndView进行传值@H_301_2@
如下所示:可以通过键值对的方式增加参数
* 往页面传递参数
@H_301_2@ 4@H_301_2@ 5@H_301_2@ @RequestMapping("/Hello5" 6@H_301_2@ ModelAndView HelloMvc5(){
@H_301_2@ 7@H_301_2@ 8@H_301_2@ ModelAndView mav= 9@H_301_2@ mav.addObject("name","张三"10@H_301_2@ mav.addObject("age",2011@H_301_2@ mav.addObject("date",1)"> Date());
@H_301_2@12@H_301_2@ mav.setViewName("WEB-INF/jsps/HelloWorld2.jsp"13@H_301_2@ 14@H_301_2@ }
2. 通过Model的方式传递参数@H_301_2@
如下所示:Model作为一个参数,可以直接新增键值对,返回一个字符串,表示页面的路径
* 从后端往前端跳转,使用Model的方式传参
@H_301_2@ 5@H_301_2@ @RequestMapping("/Hello6" String HelloMvc6(Model model){
@H_301_2@ 8@H_301_2@ model.addAttribute("name",1)"> 9@H_301_2@ model.addAttribute("age",1610@H_301_2@ model.addAttribute("date",1)">11@H_301_2@ return@H_301_2@ "WEB-INF/jsps/HelloWorld2.jsp";
@H_301_2@12@H_301_2@ }
3. 通过对象的方式传递参数@H_301_2@
如下所示:将对象通过属性的方式进行传递,也需要一个key值作为标识
* 采用对象的方式传参到前台
@H_301_2@ model
@H_301_2@ 5@H_301_2@ 6@H_301_2@ @RequestMapping("/Hello7" 7@H_301_2@ String HelloMvc7(Model model){
@H_301_2@ 8@H_301_2@ 9@H_301_2@ User user=new@H_301_2@ User(1L,"李四",20,1)">10@H_301_2@ model.addAttribute("user"301_2@model.addAttribute(user);@H_301_2@不建议用这种,会有一个默认的key,是类名的首字母小写,和对象名无关@H_301_2@
return@H_301_2@ "WEB-INF/jsps/HelloWorld3.jsp"13@H_301_2@ }
4. 通过内置对象传递参数@H_301_2@
如下所示:内置对象HttpServletRequest传递参数并进行跳转
* 通过内置对象往页面传参并跳转,不常用
@H_301_2@@throws@H_301_2@ ServletException
@H_301_2@ IOException
@H_301_2@ 7@H_301_2@ 8@H_301_2@ @RequestMapping("/Hello8" 9@H_301_2@ void@H_301_2@ HelloMvc8(HttpServletRequest req,HttpServletResponse resp) throws@H_301_2@ ServletException,IOException{
@H_301_2@10@H_301_2@ 11@H_301_2@ req.setAttribute("name","刘玲"12@H_301_2@ req.setAttribute("age",2213@H_301_2@ req.getRequestDispatcher("WEB-INF/jsps/HelloWorld2.jsp").forward(req,resp);
@H_301_2@14@H_301_2@ }
备注@H_301_2@
曾以为我是那崖畔的一枝花,后来才知道,不过是人海一粒沙。