spring mvc的简介和实操代码演示,笔记!
什么是mvc
Spring MVC是一个基于Java的实现了MVC设计模式的请求驱动类型的轻量级Web框架,通过把Model,View,Controller分离,将web层进行职责解耦,把复杂的web应用分成逻辑清晰的几部分,简化开发,减少出错,方便组内开发人员之间的配合。
转发和重定向
转发:在返回值前面加"forward:",例如"forward:user.do?name=method"
重定向:在返回值前面加"redirect:",例如"redirect:http://www.baidu.com"
重定向对象
ModelAndView mv=new ModelAndView();
//重定向对象
RedirectView rv=new RedirectView("findUser.lovo");
// rv.setUrl("/user/findUser.lovo");
mv.setView(rv);
SpringMVC的注解
@RequestMapping:用于处理请求 url 映射的注解,可用于类或方法上。用于类上,则表示类中的所有响应请求的方法都是以该地址作为父路径。/如果想要拦截get/post可以在@RequestMapping注解里面加上method=RequestMethod.GET/post
@RequestBody:注解实现接收http请求的json数据,将json转换为java对象。
@ResponseBody:注解实现将conreoller方法返回对象转化为json对象响应给客户。
@Controller注解:SpringMvc常用注解器的注解
@RestController注解:@RestController注解相当于@ResponseBody
@JsonIgnore注解 来自包com.fasterxml.jackson.annotation.JsonIgnore;在使用mvc时我们需要将对象以json对象传输,然而在一个类中很可能存在两个类相互依赖的属性!这样再我们传输的时候就会形成json对象的死循环!数据异常400报错!当然再mvc 中我们还需要导入jackson包
得到Request/Session/参数/传输对象到前端
直接在方法的形参中声明request,SpringMvc就自动把request对象传入
获取前端传回的数据,直接在对应的地址上的形参中获得相应类型的参数,注意:参数名要和传回来的名称一致
SpringMvc通过ModelMap对象,可以在这个对象里面调用put方法,把对象加到里面,前台就可以通过el表达式拿到
ModelMap里面的数据放入Session在类上面加上@SessionAttributes注解,里面包含的字符串就是要放入session里面的key
注:Spring mvc的控制器是单例模式,所以在多线程访问的时候有线程安全问题,不要用同步,会影响性能的,解决方案是在控制器里面不能写字段
Spring MVC的主要组件
前端控制器 DispatcherServlet 接收请求、响应结果,相当于转发器,有了DispatcherServlet 就减少了其它组件之间的耦合度。
处理器映射器HandlerMapping 根据请求的URL来查找Handler
处理器适配器HandlerAdapte 在编写Handler的时候要按照HandlerAdapter要求的规则去编写,这样适配器HandlerAdapter才可以正确的去执行Handler。处理器Handler
视图解析器 ViewResolver 进行视图的解析,根据视图逻辑名解析成真正的视图(view)
视图View View是一个接口, 它的实现类支持不同的显示界面
过滤器
一共两种拦截方式 :1实现HandlerInterceptor接口,实现方法来完成
2.过滤器
<filter>
<filter-name>encodingFilter</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>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
配置xml文件
Spring mvc 配置地址包全路径
org.springframework.web.servlet.DispatcherServlet/前置控制器
配置在web.xml文件中的。拦截匹配的请求,Servlet拦截匹配规则要自己定义,把拦截下来的请求,依据相应的规则分发到目标Controller来处理,是配置spring MVC的第一步
添加过滤器!设置编码集,设置编码集中的全地址
org.springframework.web.filter.CharacterEncodingFilter
在web项目中我们经常会遇到当前台JSP页面和JAVA代码中使用了不同的字符集进行编码的时候就会出现表单提交的数据或者上传/下载中文名称文件出现乱码的问题,这些问题的原因就是因为我们项目中使用的编码不一样。为了解决这个问题我们就可以使用CharacterEncodingFilter类,他是Spring框架对字符编码的处理,基于函数回调,对所有请求起作用,只在容器初始化时调用一次,依赖于servlet容器
附上配置代码xml文档
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
<servlet>
<!--DispatcherServlet是前端控制器设计模式的实现,提供Spring Web MVC的集中访问点,而且负责职责的分派-->
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--为contextConfigLocation指定加载的xml文件spring扫描的对象-->
<init-param>
<!-- 在web.xml中定义contextConfigLocation参数,Spring会使用这个参数去加载所有逗号分隔的xml文件,如果没有这个参数,Spring默认加载web-inf/applicationContext.xml文件 -->
<param-name>contextConfigLocation</param-name>
<!-- 如果配置文件不是默认此名那么就需要手动配置applicationContext.xml文件到下方-->
<param-value>WEB-INF/springMvc.xml</param-value>
</init-param>
</servlet>
<!--添加过滤器-->
<filter>
<filter-name>encodingFilter</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>
<!--Spring Web MVC的集中访问点的具体所在路径包-->
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!--过滤指定包的路径下的sevlet-->
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
注意: servlet参数配置
<init-param>
<!-- 在web.xml中定义contextConfigLocation参数,Spring会使用这个参数去加载所有逗号分隔的xml文件,如果没有这个参数,Spring默认加载web-inf/applicationContext.xml文件 -->
<param-name>contextConfigLocation</param-name>
<!-- 如果配置文件不是默认此名那么就需要手动配置applicationContext.xml文件到黄色字体上-->
<param-value>WEB-INF/springMvc.xml</param-value>
</init-param>
黄色字体配置信息文件如下
用于扫描spring全局包,使用时用备注区分
<?xml version="1.0" encoding="UTF-8"?>
<beans xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans">
<!--扫描全局包 用于Spring扫描访问所有的类,为类作注解区分 -->
<context:component-scan base-package="com.lovo.spring"/>
</beans>
service层 ,前端通过login来访问本方法
package com.lovo.spring;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.List;
@Controller
public class UserController {
private List<UserEntity> list=new ArrayList();
@RequestMapping(value = "login",method = RequestMethod.POST)
public String login(String user1, String pwd,UserEntity user, HttpServletRequest req){
UserEntity a=new UserEntity(user1,pwd);
list.add(a);
req.setAttribute("UserList",list);
return "index.jsp";
}
}
Springmvc的优点
可以支持各种视图技术,而不仅仅局限于JSP;
与Spring框架集成(如IoC容器、AOP等);
清晰的角色分配:前端控制器(dispatcherServlet) , 请求到处理器映射(handlerMapping), 处理器适配器(HandlerAdapter), 视图解析器(ViewResolver)。
支持各种请求资源的映射策略