一、控制器Controlle
控制器复杂提供访问应用程序的行为,通常通过接口定义或注解定义两种方法实现
控制器负责解析用户的请求并将其转换为一个模型。
在Spring MVC中一个控制器类可以包含多个方法
在Spring MVC中,对于Controller的配置方式有很多种
实现Controller接口
Controller是一个接口,在org.springframework.web.servlet.mvc包下,接口中只有一个方法;
@FunctionalInterface
public interface Controller {
@Nullable
ModelAndView handleRequest(HttpServletRequest var1, HttpServletResponse var2) throws Exception;
}
1、编写一个Controller类,ControllerTest1
1、//只要实现类Controller接口的类,,说明这就是哟个控制器了
public class ControllerText1 implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
ModelAndView mv = new ModelAndView();
mv.addObject("msg", "ControllerText01");
mv.setViewName("test");
return mv;
}
}
2、编写完毕后,去Spring配置文件中注册请求的bean;name对应请求路径,class对应处理请求的类
<bean name="/t1" class="com.baidu.controller.ControllerText1"/>
3、编写前端test.jsp,注意在WEB-INF/jsp目录下编写,对应我们的视图解析器
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
${msg}
</body>
</html>
4、测试:
注解实现Controller;
1、在controller包中创建ControllerTest2,用注解实现。
package com.baidu.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
//代表这个类被Spring托管,被这个注解的类中的方法,如果返回值是String,并且有具体的页面跳转,那么就会被视图解析器解析;
public class ControllerTest2 {
@RequestMapping("/t2")
public String test1(Model model) {
model.addAttribute("msg", "ControllerTest2");
return "test";
}
}
2、测试:
二、RestFul 风格
概念
Restful就是一个资源定位及资源操作的风格。不是标准也不是协议,只是一种风格。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。
功能
资源:互联网所有的事物都可以被抽象为资源
资源操作:使用POST、DELETE、PUT、GET,使用不同方法对资源进行操作。
分别对应 添加、 删除、修改、查询。
传统方式操作资源 :通过不同的参数来实现不同的效果!方法单一,post 和 get
http://127.0.0.1/item/queryItem.action?id=1 查询,GET
http://127.0.0.1/item/saveItem.action 新增,POST
http://127.0.0.1/item/updateItem.action 更新,POST
http://127.0.0.1/item/deleteItem.action?id=1 删除,GET或POST
使用RESTFul操作资源 :可以通过不同的请求方式来实现不同的效果!如下:请求地址一样,但是功能可以不同!
http://127.0.0.1/item/1 查询,GET
http://127.0.0.1/item 新增,POST
http://127.0.0.1/item 更新,PUT
http://127.0.0.1/item/1 删除,DELETE
1、再新建一个RestFulController ,在Spring MVC中可以使用 @PathVariable 注解,让方法参数的值对应绑定到一个URI模板变量上。
@Controller
public class RestFulController {
@RequestMapping(value = "/add/{a}/{b}")
public String test1(@PathVariable int a,@PathVariable int b, Model model){
int res = a + b;
model.addAttribute("msg","结果为:"+ res);
return "test";
}
}
2、测试结果:
思考:使用路径变量的好处?
- 使路径变得更加简介。
- 获得参数更加方便,框架会自动进行类型转换。
- 通过路径变量的类型可以约束访问参数,如果类型不一样,则访问不到对应的请求方法,如这里访问是的路径是/commit/1/a,则路径与方法不匹配,而不会是参数转换失败。
我们来修改下对应的参数类型,再次测试
@Controller
public class RestFulController {
@RequestMapping(value = "/add/{a}/{b}")
public String test1(@PathVariable int a,@PathVariable String b, Model model){
String res = a + b;
model.addAttribute("msg","结果为:"+ res);
return "test";
}
使用method属性指定请求类型
用于约束请求的类型,可以收窄请求范围。指定请求谓词的类型如GET, POST, HEAD, OPTIONS, PUT, PATCH, DELETE, TRACE等
我们来测试一下:
- 增加一个方法;
//我们使用浏览器地址栏进行访问默认是Get请求,会报错405: 改回Get就好了
@RequestMapping(value = "add",method = RequestMethod.POST)
public String test2(Model model){
model.addAttribute("msg","Hello!");
return "test";
}
所有的地址栏请求默认都会是 HTTP GET 类型的。
方法级别的注解变体有如下几个:组合注解
@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping
@GetMapping 是一个组合注解,平时使用的会比较多!
它所扮演的是 @RequestMapping(method =RequestMethod.GET) 的一个快捷方式。
三、视图跳转
ModelAndView
设置ModelAndView对象,根据view的名称,和视图解析器跳到指定的页面。
页面: {视图解析器前缀} + viewName + {视图解析器后缀}
<!-- 视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
id="internalResourceViewResolver">
<!-- 前缀 -->
<property name="prefix" value="/WEB-INF/jsp/" />
<!-- 后缀 -->
<property name="suffix" value=".jsp" />
</bean>
对应的Controller
//只要实现类Controller接口的类,,说明这就是哟个控制器了
public class ControllerText1 implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
ModelAndView mv = new ModelAndView();
mv.addObject("msg","ControllerText01");
mv.setViewName("test");
return mv;
}
}
ServletAPI
通过设置ServletAPI,不需要视图解析器﹒
1.通过HttpServletResponse进行输出
2.通过HttpServletResponse实现重定向
3.通过HttpServletResponse实现转发
SpringMvc
通过SpringMVC来实现转发和重定向–无需视图解析器;
在前面加上forward,请求,redirect,重定向
@Controller
public class ModelTest1 {
@RequestMapping("/m1/t1")
public String test1(Model model){
//转发
model.addAttribute("msg","ModeelTest1");
return "forward:/WEB-INF/jsp/test.jsp";
}
@RequestMapping("/m1/t2")
public String test2(Model model){
//重定向
model.addAttribute("msg","ModeelTest2");
return "redirect:/index.jsp";
}
}
测试前,需要将视图解析器注释掉
注释之后,想要访问到必须书写他的权限域名
return "/WEB-INF/jsp/test.jsp";
通过SpringMVC来实现转发和重定向–有视图解析器;
重定向,不需要视图解析器,本质就是重新请求一个新地方嘛,所以注意路径问题.
可以重定向到另外一个请求实现﹐
return "redirect:/index.jsp";
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/71847.html