控制器Controller
-
控制器复杂提供访问应用程序的行为,通常通过接口定义或注解定义两种方法实现。
-
控制器负责解析用户的请求并将其转换为一个模型。
-
在Spring MVC中一个控制器类可以包含多个方法
-
在Spring MVC中,对于Controller的配置方式有很多
建议使用注解定义,方便。
原因
传统的方法,实现controller接口,要在spring配置文件中配置bean,且一个bean对应一个请求路径,如果项目有上百个请求接口,那就需要上百个类和在spring配置文件中配置。
其实@Controller,@Component,@Repository,@Service,其中他们的功能等效,只不过为了分层,将注解运用于不同的地方。控制层用controller,业务层用service,数据库操作层用repository,component用于组件,比如讲一个工具类注入容器中。
代码(注解开发)
1.首先配置web.xml
<!--配置dispatchservlet,这是springmvc的核心:请求分发器,或者前端控制器-->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--绑定spring的配置文件-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc-servlet.xml</param-value>
</init-param>
<!--启动级别-->
<load-on-startup>1</load-on-startup>
</servlet>
<!--在springmvc中,/和/*
/只匹配所有的请求,不会匹配jsp
/*匹配所有的请求,且匹配jsp-->
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
2.创建spring配置文件springmvc-servlet.xml,记住一定会要导入约束和命名空间。
<!-- 自动扫描包,让指定包下的注解生效,由IOC容器统一管理 -->
<context:component-scan base-package="com.sh.controller"/>
<!-- 让Spring MVC不处理静态资源 .css .js .html .mp3 .mp4-->
<mvc:default-servlet-handler />
<!--
支持mvc注解驱动
在spring中一般采用@RequestMapping注解来完成映射关系
要想使@RequestMapping注解生效
必须向上下文中注册DefaultAnnotationHandlerMapping
和一个AnnotationMethodHandlerAdapter实例
这两个实例分别在类级别和方法级别处理。
而annotation-driven配置帮助我们自动完成上述两个实例的注入。
-->
<mvc:annotation-driven />
<!-- 视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
<!-- 前缀 -->
<property name="prefix" value="/WEB-INF/jsp/" />
<!-- 后缀 -->
<property name="suffix" value=".jsp" />
</bean>
3.编写界面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
${msg}
</body>
</html>
4.编写controller
/**
* @author: songhui
* @create: 2020-04-08 10:49
*/
@Controller
public class HelloController {
@RequestMapping("/hello")
public String test(Model model){
model.addAttribute("msg","hello ,springmvc");
return "test";
}
}
5.测试结果
确实相比接口定义,实际代码减少了很多,但是接口多起来,还是挺麻烦的。由此一种新的开发模式前后端分离应运而生,前端控制页面跳转、数据绑定和UI,后端就提供前端数据接口,避免了后端开发业务的同时控制页面跳转。
RequestMapping
@RequestMapping注解用于映射url到控制器类或一个特定的处理程序方法。可用于类或方法上。 用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。
ResultFul风格
概念 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.acti on?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
参数的改变
传统的
@RequestMapping("/add")
public String test(int a,int b, Model model){
int res=a+b;
model.addAttribute("msg","结果为"+res);
return "test";
}
结果
restful风格
@RequestMapping("/add/{a}/{b}")
public String test(@PathVariable("a") int a,@PathVariable("b") int b, Model model){
int res=a+b;
model.addAttribute("msg","结果为"+res);
return "test";
}
结果
请求方式的差别
更改请求方式
@RequestMapping(value = "/add/{a}/{b}",method = RequestMethod.DELETE)
因为浏览器输入是get请求,方法不被允许。
除此之外,请求方式注解还有另一种形式
-
GetMapping
-
PostMapping
-
DeleteMapping
-
PutMapping
请求方式和请求地址不能完全相同,否则会报错
好处
-
restful风格避免了参数的暴露
-
简洁
-
高效()支持缓存