了解SpringMVC
- 在spring的基础上,对 Servlet技术进行的封装处理,形成的一个MVC框架。
- SpringMVC=Spring+MVC
- SpringMVC的运行效率比struts2高
- spring使用比较多
SpringMVC的执行流程
- web.xml中配置核心控制器(分发器)===>通过Servlet完成的(DisparcherServlet)
- 需要在springmvc配置文件(就是spring配置文件)中,把方法映射成地址。
- 需要在springMVC配置文件中,做跳转。
SpringMVC环境搭建
1. 下载jar包(另外导入spring依赖jar包)
spring-web-5.2.3.RELEASE.jar
spring-webmvc-5.2.3.RELEASE.jar
2. 配置web.xml文件和SpringMVC文件
- web.xml文件配置
<!--通过servlet标签配置SpringMVC的核心控制器:分发器 DispatcherServlet-->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--始化参数指定要加载的配置文件。找到SpringMVC的配置文件-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc-servlet.xml</param-value>
</init-param>
<!--启动加载:启动tomcat的时候,就实例化、初始化servlet-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
- SpringMVC的配置文件:springmvc-servlet.xml
<!--注解驱动控制器,基于注解的处理器-->
<mvc:annotation-driven/>
<context:component-scan base-package="com.ssm.controller"></context:component-scan>
<!--配置视图解析器:把方法的返回值,转换成一个真实的地址,以转发的方式请求-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/"/>
<property name="suffix" value=".jsp"/>
</bean>
3. 搭建Controller 处理请求的控制器。
@Controller
@RequestMapping("/user")
public class UserController {
@RequestMapping("/test")
public String test(Map map){
System.out.println("进来了...");
// map:参数传递的一种方式
map.put("username" , "李四");
return "index";
}
}
- @Controller:标注一个普通的JavaBean成为可以处理请求的控制器。
- @RequestMapping:通过请求URL进行映射。可以指定接收GET或是POST或是其它的一些请求。通常用在类上和方法上。
- 返回的字符串会通过SpringMVC配置文件的视图解析器,映射成URL地址。
4. 配置一个简单的 index.jsp 前端页面,看是否跳转成功。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>${username}</h1>
</body>
</html>
小结
- 启动tomcat:
- 启动tomcat后加载wed.xml文件。
- wed.xml文件中的servlet标签配置了 load-on-startup=1 就会实例化、初始化 servlet。
- 然后加载SpringMVC的配置文件。
- SpringMVC中配置的有扫描注解,就可以把Controller包中的注解加载到。
- 然后把方法映射成地址。
- 发送一个访问请求:
- 发送一个请求经过web.xml配置文件。
- 若符合springmvc控制器、分发器规则,就把这个请求交给SpringMVC处理。
- 到SpringMVC映射好的地址中找到对应的地址。
- 进入到对应地址对应的方法中。
- 方法执行完毕后返回一个字符串。
- 通过SpringMVC配置的视图解析器转换成一个真是的地址,以转发的方式进行请求。
SpringMVC参数的传递
参数接收
1. 通过方法形参直接声明参数。不过要求参数名要和页面传递过来的参数名相同。
请求:http://localhost:8081/springmvc/test?username=admin
@RequestMapping("/test")
public String test(String username){
System.out.println("========" + username);
return "index";
}
2. 方法形参声明对象类型的参数。那么页面参数名称必须是对象的属性名。
请求:http://localhost:8081/springmvc/test?username=admin&age=18
@RequestMapping("/test")
public String test(User user){
System.out.println("======================" + user.username + user.age );
return "index";
}
3. 前两条参数传递中如果页面没有传过来参数,或参数名称没有对应就会引起使用报错。如何设置非必须的参数。
- 通过形参直接传递参数,和第一条类似,只不过需要在参数前边加 @RequestParam注解。
- 例如:请求:
http://localhost:8081/springmvc/welcome?username=admin
@RequestMapping("/welcome")
public String welcome(@RequestParam(value = "username" , required = false) String username){
System.out.println("===>" + username);
return "index";
}
- @RequestParam 注解常用属性:
- value:参数名。如果配置了此属性,需要页面传递的参数名和此属性值保持一致,而不再和参数名保持一致。
- required:当前方法的参数是否为必须的。默认为true。
参数的传递(前端通过EL和JSTL获取展示数据)
1. 通过ModelAndView对象将模型数据传递给视图。ModelAndView:包含视图信息和模型数据信息。
- 常用方法
- 添加数据:
- ModelAndView addObject(String attributeName, Object attributeValue);
- ModelAndView addAllObjects(Map<String,?> modelMap);
- 设置视图
- void setView(View view);
- void setViewName(String viewName);
- 添加数据:
@RequestMapping("/welcome")
public ModelAndView welcome(@RequestParam(value = "username" , required = true) String username){
ModelAndView mav = new ModelAndView();
mav.addObject("username" , username);
mav.setViewName("index");
return mav;
}
- 这种方式传递参数繁琐,不推荐使用。
2. 通过Model对象传递参数。Model是Map类型的数据结构。
- 常用方法:
- 添加数据模型:Model.addAttribute(String attributeName,Object attributeValue);
- 其中 key值不是必须的。在Model中增加模型数据,若不指定key,则默认使用对象的类型作为key。
@RequestMapping("/test")
public String test(Model model){
model.addAttribute("username" , "张三");
model.addAttribute("李四");
return "index";
}
对应的index.jsp
<body>
<h1>name=======>${username}</h1>
<h1>name=======>${string}</h1>
</body>
效果:
3. 在方法形参中声明Map,map中存放的数据模型会被SpringMVC放在request作用域中。
@RequestMapping("/testmap")
public String testMap(Map map){
map.put("username" , "王五");
return "index";
}
4. @ModelAttribute:加在方法形参前面,会自动把接收到的数据,放在request作用域中
@RequestMapping("/test")
public String test(@ModelAttribute(name = "name") String name){
System.out.println(name);
return "index";
}
5. @SessionAttributes:加在类上面的;把request作用域中的数据复制到session作用域中
6. session作用域中放数据:方法形参中声明HttpSession,代码中session.setAttribute(k,v);
流程跳转
- 通过视图解析器完成
- 在springmvc配置文件中通过bean标签配置视图解析器,指定前缀以及后缀:把方法返回值(逻辑视图)转换成真实的地址(物理视图),以转发的方式请求。
- 视图解析器:把逻辑视图转换为物理视图
- 方法返回带前缀的字符串;不经过视图解析器处理
- forward:/index.jsp ===> 转发的地址
- redirect:/getAll.do ===> 重定向到一个地址
转发示例:
@RequestMapping("/testmap")
public String testMap(Map map){
map.put("username" , "赵六");
return "forward:/index.jsp";
}
重定向示例:
@RequestMapping("/testmap")
public String testMap(Map map){
map.put("username" , "赵六");
return "redirect:/test";
}
静态资源文件的引用
- <mvc:resources/>标签:在SpringMVC的配置文件中添加。
- mapping:将静态资源映射到指定的路径下
- location:本地静态资源文件所在的目录
<!--引入静态资源-->
<mvc:resources mapping="/**" location="/" />