SpringMvc
1.SpringMvc简介
1.1什么是MVC
1.2什么是SpringMVC
1.3SpringMVC的特点
2.入门案例
2.1开发环境
2.2创建maven工程
①以quickstart模板创建maven工程
②对pom.xml的packaging设置为war
重新加载pom.xml文件,等加载结束后,在项目结构中设置xml文件路径
③引入依赖
<dependencies>
<!-- SpringMVC -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.1</version> </dependency>
<!-- 日志 -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version> </dependency>
<!-- ServletAPI -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<!-- Spring5和Thymeleaf整合包 -->
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf-spring5</artifactId>
<version>3.0.12.RELEASE</version>
</dependency> </dependencies>
2.3配置web.xml
①默认注册方式
因为DispatcherServlet底层为Servlet,所以注册方式和Servlet在web.Xml文件中的注册方式相同
<!-- 配置SpringMVC的前端控制器,对浏览器发送的请求统一进行处理 -->
<servlet>
<servlet-name>springMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>springMVC</servlet-name>
<!--设置springMVC的核心控制器所能处理的请求的请求路径
/所匹配的请求可以是/login或.html或.js或.css方式的请求路径
但是/不能匹配.jsp请求路径的请求,jsp的请求方式在tomcat服务器中有默认设置 -->
<url-pattern>/</url-pattern>
</servlet-mapping>
2.4创建请求控制器
2.5创建SpringMVC的配置文件
<!-- 自动扫描包 -->
<context:component-scan base-package="com.tl"></context:component-scan>
<!-- 配置Thymeleaf视图解析器 -->
<bean id="viewResolver" class="org.thymeleaf.spring5.view.ThymeleafViewResolver">
<property name="order" value="1"/>
<property name="characterEncoding" value="UTF-8"/>
<property name="templateEngine">
<bean class="org.thymeleaf.spring5.SpringTemplateEngine">
<property name="templateResolver">
<bean class="org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver">
<!-- 视图前缀 --> <property name="prefix" value="/WEB-INF/templates/"/>
<!-- 视图后缀 --> <property name="suffix" value=".html"/>
<property name="templateMode" value="HTML5"/>
<property name="characterEncoding" value="UTF-8" />
</bean>
</property>
</bean>
</property>
</bean>
<!--处理静态资源,例如html、js、css、jpg 若只设置该标签,
则只能访问静态资源,其他请求则无法访问-->
2.6测试HelloWorld
加入超链接
2.7总结
3.@RequestMapping注解
3.1@RequestMapping注解的功能
RequestMapping类似于service方法,既可接收表单的post请求,也可接收get请求
3.2@RequestMapping注解的位置
3.3@RequestMapping注解的value属性
3.4@RequestMapping注解的method属性
3.5@RequestMapping注解的params属性(了解)
3.6@RequestMapping注解的headers属性(了解)
3.7SpringMVC支持ant风格的路径
不能匹配?号以及/
3.8SpringMVC支持路径中的占位符(重点)
{}就是占位符
@pathvariable表示路径中的变量
4.SpringMvc获取请求参数
4.1通过ServletApi获取
4.2通过控制器方法的形参获取请求参数
4.3@RequestParam
当请求参数和控制器形参不一样时,使用RequestParam
比如在html中修改username为userName,这样请求参数和控制器形参就无法进行匹配,通过RequestParam指定请求参数为userName,就可以实现相应匹配了
4.4@RequestHeader
4.5@CookieValue
4.6通过POJO获取请求参数
4.7解决获取请求参数的乱码问题
是通过过滤器来设置编码,首先设置编码过滤器<filter-name>和<filter-class>
然后将过滤器的编码通过<init-param>
设置为UTF-8,但这只能解决request乱码问题,在添加forceEncoding将response编码问题解决
<!--配置springMVC的编码过滤器-->
<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>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Tomcat8以前post get都会乱码
Tomcat8以后
只有post会有乱码
设置编码之前不能获取任何参数,否则无效
5.域对象共享数据
5.1使用ServletAPI向request域对象共享数据
5.2使用ModelAndView向request域对象共享数据
5.3使用Model向request域对象中共享数据
5.4使用map向request域对象共享数据
5.5使用ModelMap向request域对象共享数据
、
5.6Model、ModelMap、Map的关系
5.7向session域共享数据
5.8向application域共享数据
session和application要加前缀
6.SpringMvc的视图
6.1ThymeleafView
6.2转发视图
6.3重定向视图
自动加上了上下文路径
6.4视图控制器view-controller
7.RESTful
7.1RESTful简介
7.2RESTful实现
7.3HiddenHttpMethodFilter
8.RESTFUL案例
8.1准备工作
public class Employee {
private Integer id;
private String lastName;
private String email;
//1 male, 0 female
private Integer gender;
@Override
public String toString() {
return "Employee{" +
"id=" + id +
", lastName='" + lastName + '\'' +
", email='" + email + '\'' +
", gender=" + gender +
'}';
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Integer getGender() {
return gender;
}
public void setGender(Integer gender) {
this.gender = gender;
}
public Employee(Integer id, String lastName, String email, Integer gender) {
this.id = id;
this.lastName = lastName;
this.email = email;
this.gender = gender;
}
public Employee() {
}
}
@Repository
public class EmployeeDao {
private static Map<Integer, Employee> employees = null;
static{
employees = new HashMap<Integer, Employee>();
employees.put(1001, new Employee(1001, "E-AA", "aa@163.com", 1));
employees.put(1002, new Employee(1002, "E-BB", "bb@163.com", 1));
employees.put(1003, new Employee(1003, "E-CC", "cc@163.com", 0));
employees.put(1004, new Employee(1004, "E-DD", "dd@163.com", 0));
employees.put(1005, new Employee(1005, "E-EE", "ee@163.com", 1));
}
private static Integer initId = 1006;
public void save(Employee employee){
if(employee.getId() == null){
employee.setId(initId++);
}
employees.put(employee.getId(), employee);
}
public Collection<Employee> getAll(){
return employees.values();
}
public Employee get(Integer id){
return employees.get(id);
}
public void delete(Integer id){
employees.remove(id);
}
}
控制层
@Controller
public class EmployeeController {
@Autowired
private EmployeeDao employeeDao;
@RequestMapping(value = "/employee",method = RequestMethod.GET)
public String getAllEmployee(Model model){
Collection<Employee> employeeList = employeeDao.getAll();
model.addAttribute("employeeList",employeeList);
return "employee_list";
}
@RequestMapping(value = "/employee",method = RequestMethod.POST)
public String addEmployee(Employee employee){
employeeDao.save(employee);
return "redirect:/employee";
}
@RequestMapping(value = "/employee/{id}",method = RequestMethod.GET)
public String toUpdate(@PathVariable("id") Integer id, Model model){
Employee employee = employeeDao.get(id);
model.addAttribute("employee",employee);
return "employee_update";
}
@RequestMapping(value = "/employee", method = RequestMethod.PUT)
public String updateEmployee(Employee employee){
employeeDao.save(employee);
return "redirect:/employee";
}
@RequestMapping(value = "/employee/{id}", method = RequestMethod.DELETE)
public String deleteEmployee(@PathVariable("id") Integer id){
employeeDao.delete(id);
return "redirect:/employee";
}
}
8.2功能清单
8.3具体功能:访问首页
8.4具体功能:查询所有员工数据
修改功能需要将员工id传输过去,但直接/employee/$(employee.id)这种写法无法被解析
8.5具体功能:删除
8.6具体功能:跳转到添加数据页面
8.7具体功能:执行保存
8.8具体功能:跳转到更新数据页面
8.9具体功能:执行更新
9.0RESTful处理静态资源
<!--
配置默认的servlet处理静态资源
当前工程的web.xml配置的前端控DispatcherServlet的url - pattern是/
tomcat的web.xml配置的DefaultServlet的url-pattern也是/
此时,浏时器发送的请求会优先DispatcherServlet进行处理,但是DispatcherServlet无法处理静态资源
若配置了<mvc:default-servlet-handler />,此时浏览器发送的所有请求都会越DispatcherServlet处理
若配置了<mvc:default-servlet-handler />和<mvc:annotation-driven />
浏览器发送的请求会先被DispatcherServlet.处理,无法处理在交给DefaultServlet处理
-->
<!-- <mvc:default-servlet-handler></mvc:default-servlet-handler>-->
<mvc:default-servlet-handler />
<mvc:annotation-driven />
<!--
path:设置处理的请求地址
view-name:设置请求地址所对应的视图名称
-->
<mvc:view-controller path="/" view-name="index"></mvc:view-controller>
<mvc:view-controller path="/to/add" view-name="employee_add"></mvc:view-controller>
</beans>