SpringMVC学习---第二课-创新互联
- SpirngMVC注解式开发
- 注解
- 对请求提交方式的定义
- 五种数据的提交方式
- 请求参数中文乱码问题的解决
- 处理器方法的返回值
- SpringMVC的四种跳转方式
- SpringMVC支持的默认参数类型
- SpringMVC的拦截器
- 拦截器说明
- 拦截器的应用场景
- 拦截器执行原理
通过***@RequestMapping*** 注解可以定义处理器对于请求的映射规则。该注解可以注解在方法上,也可以注解在类上,但意义是不同的。value 属性值常以“/”开始。@RequestMapping 的 value 属性用于定义所匹配请求的 URI。
当@RequestMapping注解在类上时,说明是有着相同的公共请求路径
当@RequestMapping注解出现在方法上时,说明是对每个方法请求的路径
以下代码发送的请求分别是:/项目名/zar/hello 和 /项目名/zar/two
@Controller //这个是声明类是Controller,将类加入springmvc管理
@RequestMapping("/zar") //声明相同的公共路径
public class HelloSpringMvc {//相当于一个控制器处理的方法
@RequestMapping("/hello")
public String one() {return "main";
}
@RequestMapping("/two")
public String two() {return "main";
}
一个@Controller 所注解的类中,可以定义多个处理器方法。当然,不同的处理器方法所匹配的 URI 是不同的。
对请求提交方式的定义对于@RequestMapping,其有一个属性 method,用于对被注解方法所处理请求的提交
方式进行限制,即只有满足该 method 属性指定的提交方式的请求,才会执行该被注解方法。
Method 属性的取值为 RequestMethod 枚举常量。
常用的为 RequestMethod.GET 与RequestMethod.POST,分别表示提交方式的匹配规则为 GET 与 POST 提交。
@RequestMapping(value = "/hello",method = RequestMethod.POST)
public String one() {return "main";
}
浏览器的常用请求方式有
只要指定了处理器方法匹配的请求提交方式为 POST,则相当于指定了请求发送的方式:要么使用表单请求,要么使用 AJAX 请求。其它请求方式被禁用。
若不指定 method 属性,则无论是 GET 还是 POST 提交方式,均可匹配。即对于请求的提交方式无要求。
五种数据的提交方式- 单个数据注入
在方法中声明一个和表单提交的参数名称相同的参数,由框架按照名称直接注入。
- 对象封装注入
在方法中声明一个自定义的实体类参数,框架调用实体类中相应的setter方法注入属性值,只要保证实体类中成员变量的名称与提交请求的name属性值一致即可。
- 动态占位符提交(只限于超链接)
使用框架提供的一个注解@PathVariable,将请求url中的值作为参数进行提取,只能是超链接。
- 请求参数名称与形参名称不一致
请求与形参中的名字不对应,可以使用
@RequestParam(value=“name1”,required=true)String namea来进行参数名称绑定。
- 使用HttpRequestServlet对象提取
在方法参数中声明一个request对象,使用request的getParameter()获取表单提交的数据,这样得到的数据还要手工进行数据类型的转换。
public String five(HttpServletRequest request){int age=new Integer(request.getParameter("stuage"));
String name=request.getParameter("stuname");
System.out.println(age+"*********"+name);
return "main";
}
请求参数中文乱码问题的解决对于前面所接收的请求参数,若含有中文,则会出现中文乱码问题。
Spring 对于请求参数中的中文乱码问题,给出了专门的字符集过滤器: CharacterEncodingFilter 类。
在 web.xml 中注册字符集过滤器,即可解决 Spring 的请求参数的中文乱码问题。不过,最好将该过滤器注册在其它过滤器之前。因为过滤器的执行是按照其注册顺序进行的。
encode org.springframework.web.filter.CharacterEncodingFilter encoding UTF-8 forceRequestEncoding true forceResponseEncoding true encode /*
处理器方法的返回值- 第一种:ModelAndView
若处理器方法处理完后,需要跳转到其它资源,且又要在跳转的资源间传递数据,此时处理器方法返回 ModelAndView 比较好。
若该处理器方法只是进行跳转而不传递数据,或只是传递数据而并不向任何资源跳转(如对页面的 Ajax 异步响应),则不需要返回这个
- 第二种:String
处理器方法返回的字符串可以指定逻辑视图名,通过视图解析器解析可以将其转换为物理视图地址。
配置视图解析器
- 第三种:无返回值void
对于处理器方法返回 void 的应用场景,应用在AJAX 响应处理。若处理器对请求处理后,无需跳转到其它任何资源,此时可以让处理器方法返回 void。
- 第四种:返回对象类型
处理器方法也可以返回 Object 对象。这个 Object 可以是 Integer,自定义对象,Map,List 等。但返回的对象不是作为逻辑视图出现的,而是作为直接在页面显示的数据出现的。返回对象,需要使用**@ResponseBody 注解**,将转换后的 JSON 数据放入到响应体中。
Ajax请求多用于Object返回值类型。
由于转换器底层使用了Jackson 转换方式将对象转换为JSON 数据,所以需要添加Jackson的相关依赖。
com.fasterxml.jackson.core jackson-databind 2.9.8
SpringMVC的四种跳转方式默认的跳转是请求转发,直接跳转到jsp页面展示
还可以使用框架提供的关键字redirect:,进行一个重定向操作 ,包括重定向页面和重定向action,
使用框架提供的关键字forward:,进行服务器内部转发操作,包括转发页面和转发action。
当使用redirect:和forward:关键字时,视图解析器中前缀后缀的拼接就无效了。
测试四种跳转方式,前端代码
请求转发页面(默认)
请求转发action
重定向页面
重定向action
测试四种跳转方式后端代码
@Controller
public class JumpAction {@RequestMapping("/one")
public String one(){System.out.println("请求转发页面(默认)");
//以前的访问方式 //request.getRequestDispatcher("/admin/main.jsp").forward(request,response);
//地址栏的变化: http://localhost:8080/one.action
//return "main"; //默认的访问方式是自动拼接前缀和后缀进行跳转
return "forward:/fore/user.jsp";
//只要使用了forward:就可以屏蔽前缀和后缀的拼接,自己手工构建返回的全部路径+.jsp
}
@RequestMapping("/two")
public String two(){System.out.println("请求转发action");
//观察地址栏的变化: http://localhost:8080/two.action
return "forward:/other.action";
//不使用forward:,就会是这样的路径 /admin/other.action/.jsp
}
@RequestMapping("/three")
public String three(){System.out.println("重定向页面");
//观察地址栏的变化 http://localhost:8080/admin/main.jsp
return "redirect:/admin/main.jsp";
//只要使用了redirect:就可以屏蔽前缀和后缀的拼接
}
@RequestMapping("/four")
public String four(){System.out.println("重定向action");
//观察地址栏的变化 http://localhost:8080/other.action
return "redirect:/other.action";
//只要使用了redirect:就可以屏蔽前缀和后缀的拼接
}
}
SpringMVC支持的默认参数类型1. HttpServletRequest 对象
2. HttpServletResponse 对象
3. HttpSession 对象
4. Model/ModelMap 对象
5. Map
SpringMVC 中的 Interceptor 拦截器,它的主要作用是拦截指定的用户请求,并进行相应的预处理与后处理。
其拦截的时间点在“处理器映射器根据用户提交的请求映射出了所要执行的处理器类,并且也找到了要执行该处理器类的处理器适配器,在处理器适配器执行处理器之前”。
当然,在处理器映射器映射出所要执行的处理器类时,已经将拦截器与处理器组合为了一个处理器执行链,并返回给了中央调度器。
- 日志记录:记录请求信息的日志
- 权限检查,如登录检查
- 性能检测:检测方法的执行时间
preHandle():在请求被处理之前进行操作
该方法在处理器方法执行之前执行。其返回值为 boolean,若为 true,则紧接着会执行处理器方法,且会将 afterCompletion()方法放入到一个专门的方法栈中等待执行。
postHandle():在请求被处理之后,但结果还没有渲染前进行操作,可以改变响应结果
该方法在处理器方法执行之后执行。处理器方法若最终未被执行,则该方法不会执行。由于该方法是在处理器方法执行完后执行,且该方法参数中包含 ModelAndView,所以该方法可以修改处理器方法的处理结果数据,且可以修改跳转方向。
afterCompletion:所有的请求响应结束后执行善后工作,清理对象,关闭资源
当preHandle()方法返回 true 时,会将该方法放到专门的方法栈中,等到对请求进行响应的所有工作完成之后才执行该方法。即该方法是在中央调度器渲染(数据填充)了响应页面之后执行的,此时对 ModelAndView 再操作也对响应无济于事。afterCompletion 最后执行的方法,清除资源,例如在 Controller 方法中加入数据等。
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
当前题目:SpringMVC学习---第二课-创新互联
链接分享:http://ybzwz.com/article/dhodhp.html