使用SpringMVC

1.配置web.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/dispatcher-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>1

此处是最简单的配置

2.普通方式

2.1 配置Spring-xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?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"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">


<!--注入IOC容器中-->
<bean name="/helloController" class="com.xxx.controller.HelloController"></bean>

<!-- 处理器映射器 -->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>

<!-- 处理器适配器 -->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>

<!-- 视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
<!-- 前缀 -->
<property name="prefix" value="/WEB-INF/jsp/"/>
<!-- 后缀 -->
<property name="suffix" value=".jsp"/>
</bean>

</beans>

BeanNameUrlHandlerMapping、SimpleControllerHandlerAdapter是普通方式实现配置的类。

name="/helloController" ,表明/helloController由HelloController控制器处理。

2.2 实现Controller接口

1
2
3
4
5
6
@FunctionalInterface
public interface Controller {
@Nullable
ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception;

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class HelloController implements Controller {

@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
ModelAndView mv = new ModelAndView();

//业务代码
String result = "HelloSpringMVC!";

//set key - value
mv.addObject("msg",result);
//试图跳转
mv.setViewName("test");

return mv;
}
}

注意到xml里配置的/helloController了吗。前端方式就增加这个路径就可以访问。但是我们会发现实现接口Controller定义控制器是较老的办法。

缺点是:一个控制器中只有一个Action,如果要多个Action则需要定义多个Controller;定义的方式比较麻烦;Spring 2.5以后采用注解的方式定义解决这引起问题。

3.注解方式

3.1 配置Spring-xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?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.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!--IoC的注解扫描-->
<context:component-scan base-package="某一个包"></context:component-scan>

<!--映射注解的handlerMapping-->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"></bean>

<!--映射注解的handlerAdapter-->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"></bean>
</beans>

RequestMappingHandlerMapping、RequestMappingHandlerAdapter是使用注解配置的类。通过omponent-scan扫描相关注解,不用自己再手动注入。

1
2
<!--SpirngMVC的注解支持,可以替代上面的Mapping和Adapter-->
<mvc:annotation-driven />

3.2 使用注解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@Controller
public class HelloController{

//真实访问地址 : 项目名/hello
@RequestMapping("/hello")
public String hello(Model model){

//封装数据
model.addAttribute("msg","HelloAnnotationMVC!");

return "hello";//会被视图解析器处理
}

@RequestMapping("/test")
public String test(Model model){
//封装数据
model.addAttribute("message","这是测试页面test.jsp");
//跳转,即被视图解析器处理后跳转页面
return "test";
}
}

我们会发现我们并没有在xml里面配置多个Controller,而是通过扫描@Controller定义控制器。

4.@Controller与@RestController

  • @Controller与@RestController的区别都是用来表示Spring某个类是否可以接收Http请求

  • @Controller用来标识一个Spring类是SpringMVC controller处理器,@Controller类中的方法可以直接通过返回string跳转jsp、ftl、html等模板页面。@Controller类中在方法上加上@ResponseBody注解,也可以返回实体对象

  • @RestController是@Controller和@ReponseBody的结合体,两个标注合起来的作用。@RestController类中的所有方法只能返回string、object、json等实体对象,不能跳转到模板页面

  • @RestContoller类中相当于所有方法都自带@ResponseBody,会自动将方法的返回值转换为json格式的响应体返回给客户端。@RestController如果想跳转页面,可以使用ModelAndView进行封装。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@RestController
public class LoginController {

@GetMapping("/authentication/getData")
public String getData() {
return "helloWorld!";
}


@GetMapping("/authentication/require")
public ModelAndView require() {
return new ModelAndView("ftl/login");
}

}

我们发现。上文的getData方法就是我们平时所写的方法。在前后端分离的时候。直接将数据返回给你客户端。而不是跳转到模板页面。本文只是介绍了Spring MVC最基本的用法。


博客说明

文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,不用于任何的商业用途。如有侵权,请联系本人删除。谢谢!


使用SpringMVC
https://nanchengjiumeng123.top/2024/01/26/framework/spring/Spring MVC/3.使用SpringMVC/
作者
Yang Xin
发布于
2024年1月26日
许可协议