文章目录
前言
接着来学习spring-MVC开发。
一、Spring-MVC是什么?
Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。是Spring提供的一种MVC开发模式的框架。
MVC:
MVC的工作流程:
MVC的工作流程: 用户通过视图层 发送请求到 服务器 ,在服务器中 请求被 Controller 接受,Controller 则调用响应的model层来处理请求,处理完之后的结果 返回给Controller,然后 controller 把结果响应给View 视图,渲染数据 最终展示在浏览器
优势:
- MVC是现下软件开发中的最流行的代码结构形态;
- 人们根据负责的不同逻辑,将项目中的代码分成 M V C 3个层次;
- 层次内部职责单一,层次之间耦合度低;
- 符合低耦合 高内聚的设计理念。也实际有利于项目的长期维护。
二、使用步骤
1.创建Maven项目导入依赖。
导入Spring-MVC的依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.1.6.RELEASE</version>
</dependency>
2.配置前端控制器
作为一个MVC框架,首先要解决的是:如何能够收到请求!
所以MVC框架大都会设计一款前端控制器,选型在 Servlet 或 Filter两者之一,在框架最前沿率先工作,接收所有请求。
此控制器在接收到请求后,还会负责springMVC的核心的调度管理,所以既是前端又是核心。
DispatcherServlet
DispatcherServlet 前端控制器 ,是框架提供的,作用 统一处理请求和响应,整个流程的控制中心,是由它来调用其他组件处理用户的请求。
我们需要在web.xml文件里添加如下配置
<servlet>
<servlet-name>mvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 局部参数:声明配置文件位置 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:mvc.xml</param-value>
</init-param>
<!-- Servlet启动时刻:可选 -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>mvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
3.配置后端控制器
后端控制器是在前端控制器接收到请求之后,下一步数据流转将要流向的地方。需要我们使用springmvc提供的注解
@Controller //声明这是一个控制器
@RequestMapping("/hello") //访问路径 ,等价于url-pattern
public class HelloController {
@RequestMapping("/test1") //访问路径
public String hello1(){
System.out.println("hello world");
return "index"; // 跳转:/index.jsp
}
@RequestMapping("/test2") //访问路径
public String hello2(){
System.out.println("hello c9");
return "views/users";// 跳转:/views/user.jsp
}
}
4.核心配置文件的编写
注意: SpringMVC的配置文件和Spring的配置文件不是同一个文件。需要单独创建一个xml文件。可以叫做spring-mvc.xml,内容如下
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
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">
<!-- 告知springmvc 哪些包中 存在 被注解的类 此处springmvc本身就是管理controller层的 -->
<context:component-scan base-package="com.qf.controller"></context:component-scan>
<!-- 注册注解开发驱动 让springmvc的注解生效 -->
<mvc:annotation-driven></mvc:annotation-driven>
<!-- 视图解析器
作用:1.捕获后端控制器的返回值="index"
2.解析: 在返回值的前后 拼接 ==> "/index.jsp"
-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 前缀 -->
<property name="prefix" value="/"></property>
<!-- 后缀 -->
<property name="suffix" value=".jsp"></property>
</bean>
</beans>
5.访问测试:
启动项目,直接在地址栏输入如下:
http://localhost:8080/hello/test1
http://localhost:8080/hello/test2
三、使用controller接收参数
在没有使用SpringMVC之前,我们从JSP发过来的请求需要通过request域对象的getParameter方法通过键值对的方式一一取出。非常的麻烦。但是现在我们可以通过在controller的方法参数列表里边。直接写出我们需要接收的参数类型和形参名即可自动匹配。
1.接收基本数据类型和string
@Controller
@RequestMapping("/login")//配置当前controller全局的访问路径
public class LoginController {
//自动注入业务层
@Autowired
private LoginService service;
@RequestMapping(value = "loginVerify",method = RequestMethod.POST)//配置当前方法的访问路径
@ResponseBody//当前方法的返回值自动转换为JSON
public ResultLayUi<User> loginSuccess(String username,String password){
return service.verifyLogin(username,password);
}
}
2.直接接收实体对象
@RequestMapping(value = "updateInfo",method = RequestMethod.POST)
@ResponseBody
public ResultLayUi<Employee> updateInfo(Employee employee){
return service.updateEmployeeInfo(employee);
}
3.接收一个Model对象
model对象是springMVC自己内置的一个模型对象,能够将request中的数据完全的复制过来
//model中的数据,会在V渲染之前,将数据复制一份给request
@RequestMapping("/test")
public String testData(Model model){
model.addAttribute("name", "张三");
return "index";
}
//jsp中用EL表达式 取值即可
${requestScope.name}
四、页面跳转和重定向
1.转发
@RequestMapping("/forw")
class ForwardController{
@RequestMapping("/test1")
public String testForward(){
System.out.println("test forward1");
// 转发跳转 /views/users.jsp
// return "views/users";//和下一行等价
return "forward:/views/users.jsp";
}
@RequestMapping("/test2")
public String testForward2(){
System.out.println("test forward2");
//转发到 /forw/test1
//return "forward:test1";//相对路径(转发到本类中的test1)
//转发到 /forw/test1
return "forward:/forw/test1"; //绝对路径
}
}
重定向
@RequestMapping("/redir")
class RedirectController{
@RequestMapping("/test1")
public String testRedirect1(){
System.out.println("test redirect1");
//重定向到 /redir/test1
//return "redirect:test1"; //相对路径(转发到本类中的test1)
return "redirect:/redir/test1";//绝对路径
}
@RequestMapping("/test2")
public String testRedirect2(){
System.out.println("test redirect2");
//重定向到 /views/users.jsp
return "redirect:/view/user.jsp";
}
}
五、静态资源的处理
静态文件没有url-pattern,所以默认是访问不到的,之所以可以访问,是因为,tomcat中有一个全局的servlet:org.apache.catalina.servlets.DefaultServlet,它的url-pattern是 “/”,是全局默认的Servlet. 所以每个项目中不能匹配的静态资源的请求,有这个Servlet来处理即可。
但,在SpringMVC中DispatcherServlet也采用了 “/” 作为url-pattern, 则项目中不会再使用全局的Serlvet,则静态资源不能完成访问。
解决办法:
添加如下配置
<mvc:resources mapping=“/html/**” location=“/hhh/”/>
- mapping是访问路径,location是静态资源存放的路径
- 将/html/** 中 /**匹配到的内容,拼接到 /hhh/后
http://…/html/a.html 访问 /hhh/a.html
这里只提供一种,还有别的办法,此处不再一一赘述。
总结
使用SpringMVC在处理请求时有很大的优势。非常好用