开发信息
简介
SpringMVC是基于MVC开发模式的框架,用来优化控制器的,它是Spring家族的一员所以它也具备IOC和AOP
SpringMVC
也叫 Spring web mvc,是spring框架的一部分,是在spring3.0之后发布的
MVC
- Model(模型):包含实体类、业务逻辑层、数据访问层
- View(视图):HTML、VUE··· 都是用来显示数据的
- Controller(控制器):用来接收客户端的请求,并返回响应到客户端的组件,Servlet就是组件
配置文件
web.xml
客户端发出请求都会发送到servlet,但是现在使用mvc后,mvc的处理器就是一个普通的方法,并不能进行servlet的操作,但是mvc提供了一个核心处理器,他是一个servlet专门用于处理mvc返回的请求,要想使用需要在web.xml配置文件中进行注册才可以使用
<!--注册mvc框架-->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<!--mvc配置文件-->
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!--要拦截的请求-->
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!--字符集编码-->
<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>
<!--过滤所有访问springmvc前端控制器的请求-->
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<servlet-name>springmvc</servlet-name>
</filter-mapping>
springmvc.xml
在mvc中使用基本上使用注解开发,所以配置文件不需要怎么写
<!-- 配置springmvc控制器的注解驱动 -->
<mvc:annotation-driven/>
<!-- 配置包扫描 -->
<context:component-scan base-package="包路径"/>
配置视图解析器
<!--视图解析器-->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<!-- 配置前缀 -->
<property name="prefix" value="/WEB-INF/view/"/>
<!-- 配置后缀 -->
<property name="suffix" value=".jsp"/>
</bean>
前缀表示去哪里寻找视图,WEB-INF这个文件夹特殊,不能在游览器进行直接访问但是mvc可以使用,所以可以把不想能直接访问的页面存入该目录内达到隐藏的目的
controller
上面配置编写完成之后,就可以通过controller进行一个访问
@Controller
@RequestMapping("/x")
public class XxxController {
@RequestMapping("/index")
public String index() {
return "index";
}
}
上面的代码就是一个简单的控制器,要在类上添加@Controller
注解表示这个是一个控制器
因为配置了视图解析器,所以直接返回index会直接去找文件夹内的index.jsp文件
直接返回是转发而且是转发到配置视图解析器的里面,可以携带关键字forward
转发到自定义路径,关键字redirect
是重定向,使用方法:return "redirect:xmln.top";
RequestMapping
@RequestMapping
这是一个类和方法上都可以使用的一个注解,该注解表示请求的路径,也就是映射服务器的访问路径
@RequestMapping(
value = {
"/index",
"/index2",
"/index3"
},
method = {
RequestMethod.POST,
RequestMethod.GET
}
)
value是映射地址,可以有多个映射地址
method表示只有使用哪种请求才能访问
前 --> 后(提交数据)
表格
<form action="/login" method="post">
<input type="text" name="username"/>
<input type="password" name="password"/>
<input type="submit" value="提交">
</form>
向login进行一个提交数据,主要就是标签里的name属性,后台接收数据由好几中方式
public String index(
User user,
String username,
@RequestParam("password") String pwd
) {
}
第一种:如果你有一个对象,对象内有相对应的名称的话可以直接使用对象接收即可,它会自己映射到对象内
第二种:手动设置相对应的名称会被映射到
第三种:继第二种,如果名称不想写一样的,需要在前面添加上 @RequestParam
注解,在注解内设置要映射的名称这样也能映射到属性中
注意:不可同时创建两个一样的名称(就如上面的一样,User中有username外面又设置的username)这样有可能会报400即请求参数畸形的错误
动态占位符
在请求路径中如:···/data/1/2/···
@RequestMapping("/data/{age}/2")
public String index(@PathVariable Integer age) {
System.out.println(age);
return "index";
}
通过{xxx}
来获取值,使用 @PathVariable
注解进行映射值使用
仅限于超链接或地址栏提交数据,他是一杠一值,一杠一大括号,使用注解解析
返回内容
一般来说mvc默认返回的是视图(页面),想要返回一段字符串或者是JSON数据需要添加上 @ResponseBody
注解(使用注解必须在配置文件中启用注解支持)
常见返回类型有:String、Object(JSON)、void、基本数据类型、ModelAndView
返回JSON时需要有Jackson-databind依赖
代码
@RequestMapping("/data")
@ResponseBody
public List<Map<String, Object>> index() {
List<Map<String, Object>> list = new ArrayList<>();
for (int i = 0; i < 5; i++) {
Map<String, Object> e = new HashMap<>();
e.put("age", i + 1);
list.add(e);
}
return list;
}
返回内容
[
{
"age": 1
},
{
"age": 2
},
{
"age": 3
},
{
"age": 4
},
{
"age": 5
}
]
springmvc会自己进行一个对象转JSON
支持的默认参数类型
不需要创建,直接使用
- HttpServletRequest 对象
- HttpServletResponse 对象
- HttpSession 对象
- Model/ModelMap 对象
- Map<String,Object> 对象
注意:Map、Model、ModelMap和request一样,都使用请求作用域进行数据传递,所以服务器端的跳转必须是请求转发
日期处理
提交处理
单个日期:使用注解@DataTimeFormat,需要在配置文件中搭配注解驱动使用
@RequestMapping("/data")
public String index(
@DateTimeFormat(pattern = "yyyy-MM-dd")
Date date
) {
return "redirect:/";
}
把前端传过来的日期是String类型转换成date类型并注入到date名称中
如果一个对象里面有Date类型数据,可以使用DataTimeFormat在serXxx或者属性上进行一个使用
注意:DataTimeFormat注解只能运用在单个属性上,如果有多个属性就需要多个注解
@InitBinder // 日期类型转换
public void initBinder(WebDataBinder binder) {
// 注册全局的日期编辑器
binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), true));
}
在控制器中使用如上代码就不需要在使用DataTimeFormat注解
日期显示
在页面中显示格式化的日期需要使用JSTL标签库
如果返回前端的类型不是String而是一个Date的类型,那么要是前端直接进行显示的话会显示一个没有格式化过的类型
<fmt:formatDate value="${date}" pattern="yyyy-MM-dd HH:mm:ss">
使用以上方式对数据进行一个转换输出正确的格式
如果返回的是JSON,那么只需要在对象中的Get方法上使用@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
就可以正确格式化