版本:idea2020.1.1 jdk1.8 maven3.6.3
注:本文章摘自Java EE企业级应用开发教程,黑马程序员/编著,仅用于记录学习笔记,分享学习经历。
Tomcat配置参考:https://mp.youkuaiyun.com/editor/html/114296147
一、DispatcherServlet
org.springframework.web.servlet.DispatcherServlet,前端控制器,在使用时,将其配置在web.xml文件中。
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--初始化时加载配置文件-->
<!--如果没有配置,默认找WEB-INF目录寻找servletName-servlet.xml命名规则的xml配置-->
<!--servileName指DispatcherServlet的name,而-servlet是固定写法-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc-config.xml</param-value>
</init-param>
<!--表示在启动时立即加载-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
二、Controller注解类型
org.springframework.stereotype.Controller用于指定Spring类的实例是一个控制器,注解形式为@Controller,使用时不需要再实现Controller接口。
import org.springframework.stereotype.Controller;
@Controller
public class FirstController{
...
}
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>5.2.8.RELEASE</version>
</dependency>
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!--指定需要扫描的包-->
<context:component-scan base-package="com.jc.controller"/>
</beans>
三、RequestMapping注解类型
org.springframework.web.bind.annotation.RequestMapping,用于映射一个请求或一个方法,注解形式为@RequestMapping,可标注在一个方法或一个类上。
属性名 | 类型 | 描述 |
---|---|---|
name | String | 可选属性,用于为映射地址指定别名 |
value | String[] | 可选属性,默认属性,用于映射一个请求和一种方法,可以标注在一个方法或一个类上 |
method | RequestMethod[] | 可选属性,用于指定该方法用于处理哪种类型的请求方式,其请求方式包括GET、POST、HEAD、OPTIONS、PUT、PATCH、DELETE和TRACE。例如method=RequestMethod.GET,如果需要支持多个请求需要写成{}中间用逗号分隔 |
params | String[] | 可选属性,用于执行Request中必须包含某些参数的值,才可以通过其标注的方法处理 |
headers | String[] | 可选属性,用于指定Request中必须包含某些指定的header的值,才可以通过其标注的方法处理 |
consumes | String[] | 可选属性,用于指定处理请求的提交内容类型(Content-type),比如application/json、text/html等 |
produces | String[] | 可选属性,用于指定返回的内容类型,返回的内容类型必须是request请求头(Accept)中包含的类型 |
1、@RequestMapping注解的使用
(1)标注在方法上
该方法成为一个请求处理方法,它会在程序接收到的对应的URL请求时被调用。
@Controller
public class FirstController {
@RequestMapping(value = "/firstController")
public ModelAndView handleRequest(HttpServletRequest request, HttpResponse response) {
...
return null;
}
}
(2)标注在类上
该类中的所有方法都将映射为相对于类级别的请求,表示该控制器所处理的所有请求都被映射到value属性值所指定的路径下。意思是如果标注,访问路径就必须为/hello/firestController
@Controller
@@RequestMapping(value = "/hello")
public class FirstController {
@RequestMapping(value = "/firstController")
public ModelAndView handleRequest(HttpServletRequest request, HttpResponse response) {
...
return null;
}
}
2、组合注解
@GetMapping、@PostMapping、@PutMapping、@DleteMapping、@PatchMapping
传统@RequestMapping用法
@RequestMapping(value = "/user/{id}",method = RequestMethod.GET)
public String selectUserById(String id) {
...
}
组合注解使用
@GetMapping(value = "/user/{id}")
public String selectUserById(String id) {
...
}
3、请求处理方法的参数类型和返回类型
javax.servlet.ServletRequest | javax.servlet.http.HttpServletRequest | |
javax.servlet.ServletResponse | javax.servlet.http.HttpServletResponse | |
javax.servlet.http.HttpSession | ||
org.springframework.web.context.request.WebRequest | org.springframework.web.context.request.NativeWebRequest | |
java.util.Locale | ||
java.util.TimeZone(Java 6+) | java.time.Zoneld(on Java 8) | |
java.io.InputStream | java.io.Reader | |
java.io.OutputStream | java.io.Writer | |
org.springframework.http.HttpMethod | ||
java.security.Principal | ||
@PathVariable、@MatrixVariable、@RequestParam、@RequestHeader、@RequestBody、@RequestPart、@SessionAttribute、@RequestAttribute | ||
HttpEntity<?> | ||
java.util.Map | org.springframework.ui.Model | org.springframework.ui.ModelMap |
org.springframework.web.servlet.mvc.support.RedirectAttributes | ||
org.springframework.validation.Errors | org.springframework.validation.BindingResult | |
org.springframework.web.bind.support.SessionStatus | ||
org.springframework.web.util.UriComponentsBuilder |
类型 | 类型 | 说明 |
---|---|---|
ModelAndView | 可以添加Model数据,并指定视图(未实现数据与视图之间的解耦) | |
Model | ||
Map | ||
View | ||
String | 返回值可以跳转视图,不能携带数据 | |
void | 异步请求时使用,只返回数据,不跳转视图 | |
HttpEntity<?> | ResponseEntity<?> | |
Callable<?> | ||
DeferredResult<?> |
返回String类型的方法示例
@RequestMapping(value = "/firstController")
public String handleRequest(HttpServletRequest request, HttpServletResponse response, Model model) {
//向模型对象中添加数据
model.addAttribute("msg","这是我的第一个Spring MVC程序");
//返回视图页面
return "/WEB-INF/jsp/first.jsp";
}
redirect重定向
@RequestMapping(value = "/update")
public String update(HttpServletRequest request, HttpServletResponse response, Model model) {
...
//重定向请求路径
return "redirect:queryUser";
}
forward请求转发
@RequestMapping(value = "/toEdit")
public String update(HttpServletRequest request, HttpServletResponse response, Model model) {
...
//请求转发
return "forward:editUser";
}
四、ViewResolver(视图解析器)
<!--定义视图解析器-->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--设置前缀-->
<property name="prefix" value="/WEB-INF/jsp/"/>
<!--设置后缀-->
<property name="suffix" value=".jsp"/>
</bean>
简化此处的逻辑视图名。
五、基于注解的Spring MVC示例
修改springmvc-config.xml ——> 修改FirstController类 ——>启动Tomcat测试
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!--指定需要扫描的包-->
<context:component-scan base-package="com.jc.controller"/>
<!--定义视图解析器-->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--设置前缀-->
<property name="prefix" value="/WEB-INF/jsp/"/>
<!--设置后缀-->
<property name="suffix" value=".jsp"/>
</bean>
</beans>
@Controller
@RequestMapping(value = "/hello")
public class FirstController{
@RequestMapping(value = "/firstController")
public String handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Model model) throws Exception {
//向模型对象中添加数据
model.addAttribute("msg","这是我的第一个Spring MVC程序jc");
//返回视图页面
return "first";
}
}