1、springmvc
是一个轻量级的前端mvc框架,类似struts2,但是比stuts2使用方便,而且性能要高于struts2.
springmvc和spring是什么关系?
springmvc仅仅是spring框架下的一个web框架。可以单独使用,不依赖于spring,但是和spring集成最方便(相对struts2)
2、快速入门
2.1. xml配置
1.需要配置web.xml
<!-- DispatcherServlet:前端控制器 配置前端控制器servlet -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--加载前端控制器配置文件 上下文配置位置 -->
<init-param>
<!--contextConfigLocation:指定springmvc配置的加载位置, 如果不指定则默认加 载WEB-INF/[DispatcherServlet的Servlet名字]-servlet.xml(例如springmvc-servlet.xml)。 -->
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:spring-mvc.xml</param-value>
</init-param>
<!-- 表示随WEB服务器启动 -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<!-- 可以拦截二种请求
第一种:拦截固定后缀的url,比如设置为 *.do、*.action, 例如:/user/add.action 此方法最简单,不会导致静态资源(jpg,js,css)被拦截
第二种:拦截所有 设置为/, 例如:/user/add /user/add.action,此方法可以实现REST风格的url 很多互联网类型的应用使用这种方式.但是此方法会导致静态文件(jpg,js,css)被拦截后不能正常显示.需要特殊处理
错误设置:拦截所有,设置为/*,此设置方法错误,因为请求到Action, 当action转到jsp时再次被拦截,提示不能根据jsp路径mapping成功. -->
<url-pattern>/</url-pattern>
</servlet-mapping>
2.导包
<!-- sping web Controller层的核心包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.1.6.RELEASE</version>
</dependency>
<!-- spring-webmvc view层的核心包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.1.6.RELEASE</version>
</dependency>
<!-- servlet 3.x -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<!-- 发布的时候,不发布servlet-api -->
<scope>provided</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.servlet.jsp/jsp-api -->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.1</version>
<!-- 发布的时候,不发布jsp-api -->
<scope>provided</scope>
</dependency>
3.在resources下增加springmvc的配置文件spring-mvc.xml,注意名称要和web.xml加载的配置文件名称一致
<?xml version="1.1" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
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-3.2.xsd">
<!-- 处理器映射器 -->
<!-- 根据bean的name进行查找Handler处理器 将请求的url配置在bean的name中 -->
<!-- 这是一个默认的映射处理器,即使不配置,那么也是默认就是这个 -->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
<!-- HandlerAdapter适配器 -->
<!-- 注意:这个适配器不是必须配置的,这是默认的、他在servlet容器已启动就被加载-->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
<!-- 就是配置url请求的路径和对应的实现类-->
<bean name="/hello" class="springmvc.HelloController"></bean>
</beans>
编写Controller,需要实现接口Controller
public ModelAndView handleRequest(HttpServletRequest request,
HttpServletResponse response) throws Exception {ModelAndView mv = new ModelAndView(); //这一步相当于request.setAttribute(“hello”,”hello SpirngMVC!!!”) mv.addObject("hello", "hello SpirngMVC!!!"); mv.setViewName("/WEB-INF/views/hello.jsp"); return mv;
}
5.编写hello.jsp,然后进行发布测试
2.2. 注解
1、导包
2、web.xml配置DispatcherServlet
3、增加spring-mvc.xml
<!-- 自动扫描且只扫描@Controller -->
<context:component-scan base-package="springmvc"
use-default-filters="false">
<context:include-filter type="annotation"
expression="org.springframework.stereotype.Controller" />
<context:include-filter type="annotation"
expression="org.springframework.web.bind.annotation.ControllerAdvice" />
</context:component-scan>
<!-- 自动加载RequestMappingHandlerMapping和RequestMappingHandlerAdapter -->
<mvc:annotation-driven />
<!-- 定义JSP文件的位置 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/" />
<property name="suffix" value=".jsp" />
</bean>
4.编写Controller,注意:不需要实现接口Controller
@Controller
@RequestMapping("/hello")
public class HelloController {
//Controller是单例模式
public HelloController(){
System.out.println("Spring mvc 启动时仅仅实例化一次Controller");
}
@RequestMapping("/sayhello")
public String hello(Model model) throws Exception {
//这一步相当于request.setAttribute("hello","hello SpirngMVC!!!")
model.addAttribute("hello", "hello SpirngMVC!!!");
//返回spring配置文件的前缀(prefix)+hello+后缀(suffix)
return "hello";
}
}
@Controller注解
- 用于标识这个类是一个后端控制器,主要作用就是接受页面的参数,转发页面。中间的业务逻辑是调用业务类处理的这个就是MVC设计模式的思路。
@RequestMapping
- 除了修饰方法,还可以修饰类
- 在类上使用:提供初步的请求信息映射.相对于WEB应用的根目录(窄化请求)
5.编写hello.jsp,然后进行发布测试
3、请求映射
3.1 请求url映射
3.1.1 多url映射
@RequestMapping(value={"/showDemo1","/show/show/show"})
public String showDemo(){
System.out.println("showDemo1....");
//打开demo页面
return "demo";
}
3.1.2 ant风格
//多层级匹配
//@RequestMapping("/show/**/showDemo2")
//一级多字符匹配
//@RequestMapping("/show/*/showDemo2")
//一级一个字符匹配
@RequestMapping("/show/??/showDemo2")
public String showDemo(){
System.out.println("showDemo2...");
return "demo";
}
3.1.1 模版映射
@RequestMapping("showDemo3/{id}")
public String showDemo3(@PathVariable("id") String id){
System.out.println("id="+id);
System.out.println("showDemo3...");
return "demo";
}
3.1.1 正则表达式映射
3.2 请求方法映射
//只过滤post请求
//支持:GET,POST,HEAD, PUT, PATCH, DELETE, OPTIONS, TRACE
//只有GET和POST最常用
//如果不写method属性,那么所有请求都将映射到这个方法
@RequestMapping(value="/showDemo4",method=RequestMethod.POST)
public String showDemo(){
System.out.println("通过请求方法过滤映射...");
return "demo";
}
3.3 请求参数映射
//过滤参数中含有name的url请求
//http://127.0.0.1:8080/springmvc-requestmapping/showDemo5?name=zhangsan
@RequestMapping(value="/showDemo5",params="name")
public String showDemo1(){
System.out.println("含有name");
return "demo";
}
3.4 请求头映射
//只允许请求头里面主机名是"127.0.0.1:8080"的才能访问
@RequestMapping(value="/showDemo6", headers="Host=127.0.0.1:8080")
public String showDemo(){
System.out.println("通过请求头限定...");
return "demo";
}
4、请求数据绑定
- @RequestParam 绑定单个请求数据,可以是URL中的数据,表单提交的数据或上传的文件;
- @PathVariable 绑定URL模板变量值
- @CookieValue 绑定Cookie数据
- @RequestHeader 绑定请求头数据
4.1. 通过注解标签
@RequestMapping(value="/addUser",method=RequestMethod.GET)
public String addUser(){
return "addUser";
}
@RequestMapping(value="/saveUser",method=RequestMethod.POST)
public String saveUser(@RequestParam("name") String name, @RequestParam("age") int age){
System.out.println("name="+name);
System.out.println("age="+age);
return "user";
}
@RequestMapping(value="/showUser/{id}")
public String showUser(@RequestHeader("Host") String host, @CookieValue("JSESSIONID") String jsessionId,@PathVariable("id") int id){
System.out.println("Host="+host);
System.out.println("jsessionId="+jsessionId);
System.out.println("id="+id);
return "user";
}
4.2. 通过javabean绑定表单数据
addStudent.jsp
<form action="${pageContext.request.contextPath }/student/saveStudent" method="post">
<label>
<span>姓名:</span>
<input type="text" name="name">
</label>
<label>
<span>年龄:</span>
<input type="text" name="age">
</label>
<label>
<span>手机:</span>
<input type="text" name="mobile">
</label>
<label>
<span>微信:</span>
<input type="text" name="weixin">
</label>
<label>
<span>爱好:</span>
<input type="text" name="hobby">
</label>
<input type="submit" value="增加">
</form>
StudentController.java
@RequestMapping("/saveStudent")
public String saveStudent(Student student){
System.out.println(student);
//去学生列表页面
return "student";
}
4.3. 绑定列表数据
addPersons.jsp
<form action="${pageContext.request.contextPath}/person/savePersons" method="post">
姓名:<input type="text" name="persons[0].name"/>
年龄:<input type="text" name="persons[0].age"/>
身高:<input type="text" name="persons[0].height"/>
体重:<input type="text" name="persons[0].weight"/><br/>
姓名:<input type="text" name="persons[1].name"/>
年龄:<input type="text" name="persons[1].age"/>
身高:<input type="text" name="persons[1].height"/>
体重:<input type="text" name="persons[1].weight"/><br/>
姓名:<input type="text" name="persons[2].name"/>
年龄:<input type="text" name="persons[2].age"/>
身高:<input type="text" name="persons[2].height"/>
体重:<input type="text" name="persons[2].weight"/><br/>
<input type="submit" value="保存"/>
</form>
Persons.java
public class Persons {
private List<Person> persons = new ArrayList<Person>();
public List<Person> getPersons() {
return persons;
}
public void setPersons(List<Person> persons) {
this.persons = persons;
}
}
Person.java
public class Person {
private String name;
private int age;
private int height;
private int weight;
//setter...
//getter...
//toString...
}
PersonsController.java
@RequestMapping("/savePersons")
public String savePersons(Persons persons){
System.out.println(persons.getPersons());
return "persons";
}