SpringMVC是Spring框架内置的MVC的实现。SpringMVC就是一个Spring内置的MVC框架。
MVC框架,它解决WEB开发中常见的问题(参数接收、文件上传、表单验证、国际化等等),而且使用简单,与Spring无缝集成。 支持 RESTful风格的 URL 请求 。
采用了松散耦合可插拔组件结构,比其他 MVC 框架更具扩展性和灵活性。
在没有使用SpringMVC之前我们都是使用的Servlet在做Web开发。但是使用Servlet开发在接受请求数据参数,数据共享,页面跳转等操作相对比较复杂。
SpringMVC底层就是的Servlet,SpringMVC就是对Servlet进行更深层次的封装。
1.导入jar包
2.编写Controller控制器(与以前servlet类似)
创建一个类实现Controller即可
public class HelloController implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
ModelAndView mv = new ModelAndView(); //ModelAndView对象封装了Model数据和View信息
mv.addObject("username", "张三");// 共享数据
mv.setViewName("/WEB-INF/hello.jsp");// 设置跳转页面
return mv;
}
}
3.在springmvc.xml配置 Controller
4.在web.xml中配置前端控制器关联springmvc.xml
<!-- 读取配置文件 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<!-- 是否在启动时加载控制器
1:是,在服务器启动以后立即创建对象
-1:否(默认),用户第一次访问时候才创建-->
<load-on-startup>1</load-on-startup>
5.配置到Tomcat上并启动
6.结果
1.导入相关jar包
2.在springmvc.xml中配置注解扫描及MVC注解支持
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
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/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
">
<!-- 配置要进行注解包扫描的位置 -->
<context:component-scan base-package="com.gjs"/>
<!-- 开启MVC注解支持, 同时还支持返回json数据-->
<mvc:annotation-driven/>
3.在web.xml中配置前端控制器
<!-- 读取配置文件 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<!-- 是否启动时加载,1:是,-1:否-->
<load-on-startup>1</load-on-startup>
4.Controller控制器
package com.gjs.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller // 声明当前类为控制器
public class HelloController {
@RequestMapping("hello")
public ModelAndView hello() {
ModelAndView mv = new ModelAndView();// ModelAndView对象封装了Model数据和View信息
mv.addObject("username", "李四");// 共享数据
mv.setViewName("/WEB-INF/hello.jsp");// 设置跳转页面
return mv;
}
}
01、用户发送出请求到前端控制器DispatcherServlet。
02、DispatcherServlet收到请求调用HandlerMapping(处理器映射器)。
03、HandlerMapping找到具体的处理器(可查找xml配置或注解配置),生成处理器对象及处理器拦截器(如果有),再一起返回给DispatcherServlet。
04、DispatcherServlet调用HandlerAdapter(处理器适配器)。
05、HandlerAdapter经过适配调用具体的处理器(Handler/Controller)。
06、Controller执行完成返回ModelAndView对象。
07、HandlerAdapter将Controller执行结果ModelAndView返回给DispatcherServlet。
08、DispatcherServlet将ModelAndView传给ViewReslover(视图解析器)。
09、ViewReslover解析后返回具体View(视图)。
10、DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。
11、DispatcherServlet响应用户。
1、前端控制器DispatcherServlet(不需要程序员开发),由框架提供,在web.xml中配置。
作用:接收请求,响应结果,相当于转发器,中央处理器。
2、处理器映射器HandlerMapping(不需要程序员开发),由框架提供。
作用:根据请求的url查找Handler(处理器/Controller),可以通过XML和注解方式来映射。
3、处理器适配器HandlerAdapter(不需要程序员开发),由框架提供。
作用:按照特定规则(HandlerAdapter要求的规则)去执行Handler。
4、处理器Handler(也称之为Controller,需要工程师开发)
注意:编写Handler时按照HandlerAdapter的要求去做,这样适配器才可以去正确执行Handler。
作用:接受用户请求信息,调用业务方法处理请求,也称之为后端控制器。
5、视图解析器ViewResolver(不需要程序员开发),由框架提供
作用:进行视图解析,把逻辑视图名解析成真正的物理视图。
SpringMVC框架支持多种View视图技术,包括:jstlView、freemarkerView、pdfView等。
6、视图View(需要工程师开发)
作用:把数据展现给用户的页面
View是一个接口,实现类支持不同的View技术(jsp、freemarker、pdf等)
具体组件的配置相关,请查阅 spring-webmvc-4.3.2.RELEASE.jar 包下面 org/springframework/web/servlet/DispatcherServlet.properties 的相关配置
按照第3和第4点的配置,会出现静态资源无法访问的情况(如html页面)。原因是在web.xml中配置的前端控制器的映射路径(
Tomcat部分源码:
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
解决方案:
方案一:如果SpringMVC要配置为/,那么就得设置Dispatcherservlet对静态资源进行支持。
在SpringMVC的配置文件中添加以下代码开启对静态资源的访问
方案二:SpringMVC映射路径不要配置为/ (也不要配置为/* ,/*会匹配所有url)
实际开发中一般推荐使用 *.后缀 如 *.do *.action
注:访问时以.do结尾的url访问,配置方法的映射路径时可以不加.do(建议不加)
@RequestMapping注解主要用于设置SpringMVC请求的映射路径
所谓的映射路径,就是匹配请求路径和执行方法关系的路径.
请求路径:http://localhost:8080/springmvc/method1.do
映射路径:@RequestMapping(value="/method1") (“value=”可以省略)
@RequestMapping 用于贴在控制器的类上或者方法上面
如果是贴在控制器的类上面,那么在访问这个类的方法之前必须先加上类上的对应的名称类似于 项目下面的 模块名称
如果贴在方法上面,就是访问此方法的资源名称
@Controller
@RequestMapping("/request") //访问时候必须加上,类似模块名称
public class RequestController {
@RequestMapping(value="/method1") //资源名称
public void method1() {
}
}
访问地址 : http://localhost:8080/springmvc/request/method1.do
SpringMVC支持对请求的限制.如果不满足限制的条件,就不让访问执行方法。这样做,大大提高了执行方法的安全性。
主要的限制有两种:方法限制(method),参数限制
设置请求的method类型(get/post)。如果发送过来的请求与方法设置的method不一样,就不能访问执行方法。
/*
* @RequestMapping 请求映射注解
* value : 请求的url地址映射,没有其他参数时“value=”可以省略,有其他参数就不能省略
* method :限定请求方式 GET /POST 默认没有限制get/post都可以
* params : 请求参数的限制: 必须有什么参数,必须没有什么参数,参数的值必须是什么
*/
@RequestMapping(value="/login1",method=RequestMethod.POST)
public ModelAndView login(HttpServletRequest request,HttpServletResponse reponse,HttpSession sesion ) {
String username = request.getParameter("username");
String password = request.getParameter("password");
System.out.println(username);
System.out.println(password);
return null;
}
<%-- EL表达式获取上下文路径 : ${pageContext.request.contextPath} --%>
参数条件“username, password”不满足,实际请求参数:username={admin}, pwd={123}
SpringMVC的方法默认可以注入 JavaWeb开发常用的数据共享对象,如:HttpServletRequest 、HttpServletResponse、HttpSession。获取这些共享对象以后,就可以向之前的Servlet一样,做任何数据共享以及页面跳转操作
SpringMVC的数据绑定就是将请求带过来的表单数据绑定到执行方法的参数变量。
实际开发中,SpringMVC作为表现层框架,肯定会接受前台页面传递过来的参数,SpringMVC提供了丰富的接受参数的方法
SpringMVC可以注入HttpServletRequest对象,直接使用getParameter()接受参数,但一般不会这种方法,还用这种方法接收参数的话使用SpringMVC的意义就不大,这种方法了解即可。
@RequestMapping("/method1")
public ModelAndView method1(HttpServletRequest request) {
String username = request.getParameter("username");
String age = request.getParameter("age");
System.out.println(username);
System.out.println(age);
return null;
}
在方法形参上,声明和表单字段名相同的参数名(可以进行自动同名匹配,然后注入)
@RequestMapping("/method2")
public ModelAndView method2(String username, Integer age) {
System.out.println(username);
System.out.println(age);
return null;
}
方法形参与表单字段名参数名不同是,要使用 @RequestParam注解 绑定请求参数到方法参数
@RequestMapping("/method3")
public ModelAndView method3(@RequestParam("name") String username, Integer age) {
System.out.println(username);
System.out.println(age);
return null;
}
@RequestMapping("/method4")
public ModelAndView method4(String username, Integer age, String[] hobbys) {
System.out.println(username);
System.out.println(age);
System.out.println(Arrays.toString(hobbys));
return null;
}
如果后台接收的属性名与前台不一致需要在数组前面加上@RequestParam注解
在实际开发中经常需要把接收的参数封装到javaBaen对象中。springMVC提供了直接接收javaBaen对象的方式,直接把javaBaen对象作为方法的形参,从前台接收到的参数就会自动映射注入到对象中,但必须保证javaBaen对象的属性名与从前台接收到的参数名一致,否则就无法映射
package com.gjs.pojo;
import java.util.Arrays;
public class User {
private String username;
private String password;
private String email;
private String phone;
private String[] hobby;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String[] getHobby() {
return hobby;
}
public void setHobby(String[] hobby) {
this.hobby = hobby;
}
public User() {
super();
}
public User(String username, String password, String email, String phone, String[] hobby) {
super();
this.username = username;
this.password = password;
this.email = email;
this.phone = phone;
this.hobby = hobby;
}
@Override
public String toString() {
return "User [username=" + username + ", password=" + password + ", email=" + email + ", phone=" + phone
+ ", hobby=" + Arrays.toString(hobby) + "]";
}
}
//接受对象,直接在方法的参数上面注入pojo对象,pojo对象的属性和表单的参数名必须一样
@RequestMapping("/method5")
public ModelAndView method5(User user) {
System.out.println(user);
return null;
}
有的时候我们需要接收多个参数,但又不想使用对象接收,这时可以用Map集合接收。只需要把map集合作为方法参数注入然后在map参数前面加上@RequestParam 注解即可, SpringMVC在接受表单参数时候回自动创建一个map集合, 并且把表单的参数名作为map的key,参数值作为map的value。使用map集合可以接受任意个数的参数,但需要注意map只能接受单个值的参数,接收数组类型的参数只会接收第一个元素
<fieldset>
<legend>接受参数封装成Map集合</legend>
<form action="${pageContext.request.contextPath}/request/method6.do" method="post">
账号: <input name="username"><br>
密码: <input name="password"><br>
邮箱: <input name="email"><br>
电话: <input name="phone"><br>
爱好:<input type="checkbox" name="hobby" value="java">java
<input type="checkbox" name="hobby" value="C">C
<input type="checkbox" name="hobby" value="C++">C++<br />
<button type="submit">提交</button>
</form>
</fieldset>
@RequestMapping("/method6")
public ModelAndView method6(@RequestParam Map<String, Object> paramsMap) {
System.out.println(paramsMap);
return null;
}
REST(英文:Representational State Transfer,简称REST)描述了一个架构样式的网络系统,比如 web 应用程序。它首次出现在 2000 年 Roy Fielding 的博士论文中,他是 HTTP 规范的主要编写者之一。在目前主流的三种Web服务交互方案中,REST相比于SOAP(Simple Object Access protocol,简单对象访问协议)以及XML-RPC更加简单明了,REST都倾向于用更加简单轻量的方法设计和实现。值得注意的是REST并没有一个明确的标准,而更像是一种设计的风格。
RESTful一种软件架构风格、设计风格,而不是标准,只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。
例如:根据商品id查询对应的商品信息(京东网站)
如果按照我们web开发应该是将商品id通过get方法跟在地址后面
普通方式 https://item.jd.com?product_id=100000287117 京东不支持
但是京东不是使用的此种方式,使用的 RESTFUL风格
RESTful风格 : https://item.jd.com/100000287117.html
@PathVariable用于将请求URL中的模板变量(动态参数)映射到功能处理方法的参数上。
// RESTful风格
@RequestMapping(value = "/method7/{product_id}.html")
public ModelAndView method7(@PathVariable("product_id") Integer product_id) {
System.out.println(product_id);//
return null;
}
访问地址:localhost:8080/springmvc/request/method7/1231323123.html
注:.html 的url会被Tomcat当做静态资源处理了,所以配置springmvc的前端控制器时映射路径要陪 / ,然后再配置开启对静态资源的访问
1.可以让页面伪静态,页面访问感觉像在访问静态html页面,实际上访问时动态页面(伪静态)
2.方便搜索引擎的SEO优化(html页面在搜索引擎搜索结果比较靠前)
SpringMVC默认接受的参数是ISO-8859-1编码参数,单字节,不支持中文。Spring提供了一个过滤器 org.springframework.web.filter.CharacterEncodingFilter 可以让开发者自定义请求参数的字符编码。
在web.xml中配置过滤器
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<!-- 使用初始化参数设置字符集 -->
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<!-- 过滤所有请求 -->
<url-pattern>/\*</url-pattern>
</filter-mapping>
如果是get方式还需要修改Tomcat的配置:修改tomcat/conf/server.xml,在
useBodyEncodingForURI="true":是否设置用request的字符集对URL提交的数据和表单中GET方式提交的数据进行重新编码
@RequestMapping("method1")
public void method1(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//数据共享
request.setAttribute("username", "张三");
//请求转发
//request.getRequestDispatcher("/WEB-INF/response.jsp").forward(request, response);
//url重定向(可以跨域访问)
response.sendRedirect("http://www.baidu.com");
}
ModelAndView :模型和视图。Spring提供此对象可以集中管理共享数据操作和设置跳转视图操作。但 ModelAndView 只能使用请求转发。
@RequestMapping("method2")
public ModelAndView method2() {
ModelAndView mv = new ModelAndView();
mv.addObject("username", "李四"); //数据共享
mv.setViewName("/WEB-INF/response.jsp");//设置视图地址
return mv;
}
直接将需要共享的数据封装到Model对象,方法返回值(String字符串)为需要跳转的地址。 默认使用请求转发
@RequestMapping("method3")
public String method3(Model m) {
m.addAttribute("username", "王五"); //数据共享
return "/WEB-INF/response.jsp"; //返回视图地址
}
<!-- 配置视图前缀 -->
<property name="prefix" value="/WEB-INF/"/>
<!-- 配置视图后缀 -->
<property name="suffix" value=".jsp"/>
</bean>
Controller方法返回字符串表示逻辑视图名,通过视图解析器解析为物理视图地址。
此时默认的物理视图地址为:视图前缀+逻辑视图名称+视图后缀
@RequestMapping("method2")
public ModelAndView method2() {
ModelAndView mv = new ModelAndView();
mv.addObject("username", "李四"); //数据共享
//配置视图解析器之前
//mv.setViewName("/WEB-INF/response.jsp");//设置视图地址
//配置视图解析器之后:配置一个逻辑视图名称
mv.setViewName("response");
return mv;
}
@RequestMapping("method3")
public String method3(Model m) {
m.addAttribute("username", "王五"); //数据共享
//配置视图解析器之前
//return "/WEB-INF/response.jsp"; //返回视图地址
//配置视图解析器之后:返回一个逻辑视图名称
return "response";
}
如果直接使用视图解析器的配置开发,那么必须保证视图解析器前缀目录下面有对应的页面文件才能跳转,否则报错。
默认页面跳转也只能使用请求转发跳转,不能使用重定向 需要解决问题: 除了使用视图解析器对应规则的开发,用户还得自定义跳转方式,和自定义跳转页面 方案:
使用视图解析器的 请求转发和重定向配置,可以打破默认的规则
spring源码:
public static final String REDIRECT_URL_PREFIX = "redirect:";
public static final String FORWARD_URL_PREFIX = "forward:";
重定向:redirect:
请求转发:forward:
// 自定义请求转发页面跳转的地址 : forward: 跳转的地址
@RequestMapping("method4")
public String method4(Model m) {
m.addAttribute("username", "赵六");
return "forward:/WEB-INF/response.jsp";
}
// 自定义重定向页面跳转的地址 redirect: 跳转的地址
@RequestMapping("method5")
public String method5(Model m) {
return "redirect:http://www.baidu.com";
}
返回对象默认使用就是请求转发,跳转的页面规则 :视图解析器前缀 + 模块名+@RequestMapping的值 + 后缀。返回的对象即共享的数据,共享的名称默认为对象类型的首字母小写。可以使用@ModelAttribute("设置共享模型的属性名称")
@RequestMapping("method6")
@ModelAttribute("userKey") //设置共享模型的属性名称
public User method6() {
User user = new User("马七","123", "10000@qq.com", "1", null);
return user;
}
在web开发中,前台页面经常会发送ajax请求从后台请求数据,ajax请求给前台的数据一般都是json 数据。
SpringMVC支持自动将对象转换JSON格式的数据响应给客户端
SpringMVC默认使用的是 jackson 作为对象转json的工具
先导入jackson的jar包
下载地址:https://mvnrepository.com/search?q=jackson
使用@ResponseBody注解方法的返回值会以字符串的形式返回,springMVC会自己调用jackson 把对象转换成json字符串
@RequestMapping("/getObjectByJson")
@ResponseBody //将方法的返回值以字符串的形式返回
public User getObjectByJson() {
User user = new User();
user.setUsername("小明");
user.setPassword("123");
user.setPhone("135xxxx");
user.setEmail("xiaoming@qq.com");
return user;
}
@RequestMapping("/getListtByJson")
@ResponseBody
public List<User> getListByJson() {
List<User> users = new ArrayList<>();
for (int i = 0; i < 10; i++) {
User user = new User();
user.setUsername("小明 : "+i);
user.setPassword("123 :"+i);
user.setPhone("135xxxx :"+i);
user.setEmail( "xiaoming@qq.com");
users.add(user);
}
return users;
}
在web开发中一般都会有文件上传的操作
一般在JavaWeb开发中文件上传使用的 Apache组织的Commons FileUpload组件
SpringMVC中使用 MultipartFile file对象接受上传文件,必须保证 后台参数的名称和表单提交的文件的名称一致
文件上传必须条件
1.表单必须post
2.表单必须有 file 文件域
3.表单的 enctype="multipart/form-data"
步骤:
1.导入相关jar包
2.在springmvc.xml中配置上传解析器
property的value用来设置上传文件的最大尺寸,其他配置为固定配置
3.jsp代码
手机扫一扫
移动阅读更方便
你可能感兴趣的文章