Nice!终于有人把SpringMVC讲明白了【简介、入门】
一、SpringMVC简介
1.1、SpringMVC引言
为了使Spring有可插入的MVC架构,SpringFrameWork在Spring基础上开发SpringMVC框架,从而在使用Spring进行WEB开发时可以选择使用Spring的SpringMVC框架作为web开发的控制器框架。
1.2、SpringMVC的优势
SpringMVC是一个典型的轻量级MVC框架,在整个MVC架构中充当控制器框架,相对于之前的struts2框架,SpringMVC运行更快,其注解式开发更高效灵活。
- 可以和Spring框架无缝整合。
- 运行效率远远高于struts2框架。
- 注解式开发更高效。
二、SpringMVC入门
2.1、环境搭建
2.1.1、引入依赖
依赖就忽略了,我放在了评论区!
2.1.2、编写配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
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">
<!-- 1. 开启注解扫描-->
<context:component-scan base-package="com.lin.controller"/>
<!-- 2. 配置处理器映射器-->
<!-- <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" />-->
<!-- 3. 开启处理器适配器-->
<!-- <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter" />-->
<!-- 上面两段配置被下面的一句话所替代(封装)-->
<mvc:annotation-driven />
<!-- 4. 开启视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
2.1.3、配置web.xml
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<!-- 配置springmvc的核心servlet-->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<!-- 告诉springmvc配置文件的位置-->
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<!-- 拦截所有请求-->
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
2.1.4、编写控制器
package com.lin.controller;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* @author XiaoLin
* @date 2021/2/17 17:09
*/
@Controller
public class HellowController {
/**
* @Description:第一个springmvc测试类
* @author XiaoLin
* @date 2021/2/17
* @Param: [username, password]
* @return java.lang.String
*/
/*
RequestMapping的修饰范围:可以用在类上和方法上,他的作用如下:
1. 用在方法上可以给当前方法加入指定的请求路径
2. 用在类上可以给类中的所有方法都加入一个统一的请求路径,在这个方法访问之前都必须加上
*/
@RequestMapping("/hello")
public String hello(String username,String password){
System.out.println("hello");
return "index";
}
}
2.2、注解详解
2.2.1、@Controller
该注解用来类上标识这是一个控制器组件类并创建这个类实例,告诉spring我是一个控制器。
2.2.2、@RequestMapping
这个注解可以作用在方法上或者是类上,用来指定请求路径。
2.3、SpringMVC的跳转方式
传统的Servlet开发跳转方式有两种:
- forward:forward跳转,是在服务器内部跳转,所以是一次请求,地址栏不变。跳转时可以携带数据进行传递(使用request作用域进行传递)。
- redirect:redirect跳转是客户端跳转,所以是多次请求,地址栏会改变,跳转时不可以携带数据传递。
2.3.1、Controller ——>前台页面
2.3.1.1、forward
通过测试我们可以发现,SpringMVC默认的就是使用请求转发的方式来进行跳转到前台页面的;
@Controller
@RequestMapping("forwoartAndRedirect")
public class TestForwoartAndRedirect {
@RequestMapping("test")
public String test(){
System.out.println("test");
return"index";
}
}
2.3.1.2、redirect
如果我们想使用重定向的方式来进行跳转的话,需要使用SpringMVC提供给我们的关键字——redirect:
来完成。
语法:return "redirect:/视图全路径名";
**注意:**在redirect:
后接页面的不是逻辑名,而是全路径名。因为redirect跳转不会经过视图解析器。
2.3.1Controller ——>Controller
2.3.1.1、forward
如果我们想使用请求转发的方式跳转到相同(不同)Controller的不同方法的时候,我们也需要使用SpringMVC提供的关键字:forward:
。
语法:return:"forward: /需要跳转的类上的@RequestMapping的值/需要跳转的方法上的@RequestMapping的值;"
2.3.1.2、redirect
如果我们想使用重定向的方式跳转到相同(不同)Controller的不同方法的时候,我们也需要使用SpringMVC提供的关键字:redirect:
。
语法:return:"redirect: /需要跳转的类上的@RequestMapping的值/需要跳转的方法上的@RequestMapping的值;"
2.4、SpringMVC的参数接收
2.4.1、Servlet接收参数的方式
在传统的Servlet开发,我们一般都是用这种方式来进行接收请求参数的。
// 接收名字为name的参数
request.getParameter(name)
他有几个需要注意的点:
- 参数要求是表单域的name属性。
- getParameter方法用于获取单个值, 返回类型是String。
- getParameterValues方法用于获取一组数据, 返回结果是String[]。
- 冗余代码较多, 使用麻烦, 类型需要自己转换。
2.4.2、SpringMVC的参数接收
SpringMVC使用的是控制器中方法形参列表来接收客户端的请求参数,他可以进行自动类型转换,要求传递参数的key要与对应方法的形参变量名一致才可以完成自动赋值。他的优势很明显:
- 简化参数接收形式(不需要调用任何方法, 需要什么参数, 就在控制器方法中提供什么参数)。
- 参数类型不需要自己转换了。日期时间(默认为yyyy/MM/dd)得注意,需要使用@DateTimeFormat注解声明日期转换时遵循的格式, 否则抛出400异常。
2.4.2.1、基本数据类型
要求传递参数的key要与对应方法的形参变量名一致才可以完成自动赋值。
2.4.2.2、对象类型
如果我们需要接收对象类型的话,直接将需要接收的对象作为控制器的方法参数声明即可。SpringMVC会自动封装对象,若传递参数key与对象中属性名一致,就会自动封装成对象。
2.4.2.3、数组类型
如果我们需要接收数组类型的时候,只需将要接收的数组类型直接声明为方法的形式参数即可。
2.4.2.4、集合类型
SpringMVC不能直接通过形式参数列表的方式接收集合类型的参数,如果需要接收集合类型的参数必须将集合放入一个对象中,并且提供get/set方法,才可以。推荐放入VO对象中进行封装,进而使用对象类型来进行接收。
2.5、SpringMVC接收参数中文乱码问题
2.5.1、GET请求
GET请求方式出现乱码需要分Tomcat版本进行讨论:
- Tomcat8.x版本之前:默认使用server.xml中的
URIEncoding="ISO-8859-1"
编码,而不是"UTF-8"编码,进而会出现中文乱码。 - Tomcat8.x版本之后:默认使用server.xml中的
URIEncoding="UTF-8"
,所以不会出现中文乱码问题。
2.5.2、POST请求
SpringMVC中默认没有对POST请求进行任何编码处理,所以无论什么版本直接接收POST请求都会出现中文乱码。
2.5.2.1、自定义过滤器解决POST乱码请求
在Servlet阶段,我们学过过滤器,我们可以自定义过滤器来进行过滤编码。
package com.filter;
import javax.servlet.*;
import java.io.IOException;
//自定义编码filter
public class CharacterEncodingFilter implements Filter {
private String encoding;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
this.encoding = filterConfig.getInitParameter("encoding");
System.out.println(encoding);
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
request.setCharacterEncoding(encoding);
response.setCharacterEncoding(encoding);
chain.doFilter(request,response);
}
@Override
public void destroy() {
}
}
<!--配置post请求方式中文乱码的Filter-->
<filter>
<filter-name>charset</filter-name>
<filter-class>com.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>charset</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
2.5.2.2、使用CharacterEncodingFilter解决POST乱码请求
<!--配置post请求方式中文乱码的Filter-->
<filter>
<filter-name>charset</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>charset</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
package com.filter;
import javax.servlet.*;
import java.io.IOException;
//自定义编码filter
public class CharacterEncodingFilter implements Filter {
private String encoding;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
this.encoding = filterConfig.getInitParameter("encoding");
System.out.println(encoding);
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
request.setCharacterEncoding(encoding);
response.setCharacterEncoding(encoding);
chain.doFilter(request,response);
}
@Override
public void destroy() {
}
}
2.6、SpringMVC中数据传递机制
2.6.1、什么事数据传递机制
数据传递机制主要包含三个问题:
- 数据如何存储?
- 如何在页面中获取数据?
- 在页面中获取的数据该如何展示?
2.6.2、Servlet的数据传递机制
在以前的Servlet开发中,我们一般是将数据放入作用域(request、session、application),如果数据是单个的直接用EL表达式在前端进行展示,如果是集合或者数组,可以用EL表达式➕JSTL标签进行遍历后在前端进行展示。
- 点赞
- 收藏
- 关注作者
评论(0)