SpringMvc总结
SpringMVC总结
1、开发服务器端程序,一般都是基于两种形式,一种是C/S架构程序,一种是B/S架构程序
2、java语言基本上都是开发B/S架构程序,B/S架构程序又分为三层架构:
- 表现层:WEB层,用来和客户端浏览器进行数据交互的,表现层一般会才用MVC的设计模型
- 业务层:处理项目具体的业务逻辑,实现业务逻辑功能
- 持久层:用来操作数据库的
3、MVC设计模型:
- MVC全名是:model view controller 模型视图控制器 ,每个部分各司其职
- model:数据模型,javabean,entity类,用来接收和返回数据
- view:指jsp、html用来展示数据给用户
- controller:用来接收用户的请求,整个流程的控制器,也可用来对数据校验
SpringMVC的概述
1、是一种基于java实现的MVC设计模型的请求驱动类型的轻量级WEB框架
2、 Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供 了构建 Web 应用程序的全功能 MVC 模块
3、SpringMVC属于三层架构中的表现层框架
4、Spring家族原生产品,与IOC容器等基础设施无缝对接
5、基于原生的servlet,通过功能强大的前端控制器DispatcherServlet,对请求和响应进行统一管理
6、可插拔式组件,想要什么功能配置相应组件即可
SpringMVC入门
1、导入maven依赖,网上可查
2、配置web.xml(web工程的入口配置文件,注册servlet、监听器、过滤器等)
<!-- SpringMVC的核心控制器 -->
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet—class>
<!-- 配置Servlet的初始化参数,读取springmvc的配置文件,创建spring容器 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<!--设置前端控制器DispatcheServlet初始化时间,在服务器启动之前 不会影响第一次访问的时间 -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<!--springmvc核心控制器所能处理的请求路径
/ 不能匹配.jsp的请求路径;/* 所有请求
-->
<url-pattern>/</url-pattern>
</servlet-mapping>
3、编写springmvc配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
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.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 配置spring创建容器时要扫描的包 -->
<context:component-scan base-package="com.wfq"></context:component-scan>
<!-- 配置视图解析器 也可以配置thymeleaf视图解析器需要引入对应的依赖-->
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
<!-- 配置spring开启注解mvc的支持
<mvc:annotation-driven></mvc:annotation-driven>-->
</beans>
4、编写.jsp放在WEB-INF 目录下(浏览器不能直接访问,只能通过转发访问),编写Controller类
常用注解:
- @RequestMapping:建立请求URL和处理方法之间的对应关系,/表示根目录,可以作用在类(请求一级目录)和方法上(请求二级目录),属性: path 指定请求路径的url 、 value属性和path属性是一样的 、mthod 指定该方法的请求方式 、params 指定限制请求参数的条件 、headers 发送的请求中必须包含的请求头
- @RequestParam:作用:把请求中的指定名称的参数传递给控制器中的形参赋值,属性:value:请求参数名称、required:请求中是否必须提供该参数 默认true
- @RequestBody:获取请求体内容(get方法不可以使用),属性:required,是否必须有请求体 默认true
- @PathVariable:绑定请求url中的占位符,例如@RequestMapping(path="/hello/{id}"),属性:value:指定url中占位符名称
- @RequestHeader:作用:获取指定请求头的值,属性:value :请求头名称,例如:(@RequestHeader(value="Accept") String header)
- @CookieValue:作用:用于获取指定cookie的名称的值,属性:value :cookie的名称,例如:(@CookieValue(value="JSESSIONID") String cookieValue)
- @ModelAttribute: 出现在方法上:表示当前方法会在控制器方法执行前线执行, 出现在参数上:获取指定的数据给参数赋值(通过map的key和value)。
- @SessionAttributes:作用:用于多次执行控制器方法间的参数共享,value:指定存入属性的名称,作用在类上
Restful风格的URL:请求路径一样,可以根据不同的请求方式去执行后台的不同方法,例如post请求会执行post方法
请求参数中解决中文乱码的问题:
在web.xml中配置spring提供的过滤器类
<!-- 配置过滤器,解决中文乱码的问题 -->
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filterclass>
<!-- 指定字符集 -->
<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>
在 springmvc 的配置文件中可以配置,静态资源不过滤(不会被核心控制器拦截):
<!-- location 表示路径,mapping 表示文件,**表示该目录下的文件以及子目录的文件 -->
<mvc:resources location="/css/" mapping="/css/**"/>
<mvc:resources location="/images/" mapping="/images/**"/>
<mvc:resources location="/scripts/" mapping="/javascript/**"/
get 请求方式: tomacat 对 GET 和 POST 请求处理方式是不同的,GET 请求的编码问题,要改 tomcat 的 server.xml 配置文件中的
自定义类型转换器
1、表单提交的任何数据类型全部都是字符串类型,但是后台定义Integer类型,数据也可以封装上,说明 Spring框架内部会默认进行数据类型转换。自定义类型转换器:实现Converter接口
package com.wfq.utils;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.springframework.core.convert.converter.Converter;
/**
* 把字符串转换成日期的转换器
* @author rt
*/
public class StringToDateConverter implements Converter<String, Date>{
/**
* 进行类型转换的方法
*/
public Date convert(String source) {
// 判断
if(source == null) {
throw new RuntimeException("参数不能为空");
}
try {
DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
// 解析字符串
Date date = df.parse(source);
return date;
} catch (Exception e) {
throw new RuntimeException("类型转换错误");
}
}
}
在springmvc.xml中注册自定义类型转换器
<!-- 注册自定义类型转换器 -->
<bean id="conversionService"
class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<bean class="cn.wfq.utils.StringToDateConverter"/>
</set>
</property>
</bean>
<!-- 开启Spring对MVC注解的支持 -->
<mvc:annotation-driven conversion-service="conversionService"/>
springMVC接收参数:
SpringMVC 绑定请求参数是自动实现的,但是要想使用,必须遵循使用要求。属性名和参数名称一致;
接收的请求参数是 json 格式数据。需要借助一个注解(@requestBody)实现。
使用 ServletAPI 对象作为方法参数: 只需要在控制器的方法参数定义HttpServletRequest、HttpServletResponse和HttpSession对象
springmvc返回
1、void返回类型,默认返回和请求路径相同的jsp页面,
可以用请求转发,调转到指定页面:
request.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(request, response);
return;
也可以用重定向,跳转到指定的页面:(无法请求WEB-INF目录下的)
response.sendRedirect("testRetrunString")
也可以通过 response 指定响应结果,例如响应 json 数据:
response.setCharacterEncoding("utf-8");
response.setContentType("application/json;charset=utf-8");
response.getWriter().write("json 串");
ModelAndView是 SpringMVC 为我们提供的一个对象,该对象也可以用作控制器方法的返回值。 该对象中有两个方法:
ModelAndView mv = new ModelAndView(); mv.addObject("username", "张三"); mv.setViewName("success");
jsp页面可以通过${requestScope.username}获取值
controller 方法在提供了 String 类型的返回值之后,默认就是请求转发。我们也可以写成:return "forward:/WEB-INF/pages/success.jsp"; (需要写页面路径不再使用视图解析器)
// 页面加载
// 页面加载
$(function(){
// 绑定点击事件
$("#btn").click(function(){
$.ajax({
url:"user/testJson",
contentType:"application/json;charset=UTF-8",
data:'{"addressName":"aa","addressNum":100}',
dataType:"json",
type:"post",
success:function(data){
alert(data);
alert(data.addressName);
}
});
});
});
json字符串和JavaBean对象互相转换的过程中,需要使用jackson的jar包
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.0</version>
</dependency>
SpringMvc文件上传
1、导入jar包
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
2、jsp页面
<h3>文件上传</h3>
<form action="user/fileupload" method="post" enctype="multipart/form-data">
选择文件:<input type="file" name="upload"/><br/>
<input type="submit" value="上传文件"/>
</form>
Springmvc上传文件需要配置文件解析器获取文件上传对象MultipartFile
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="10485760"/>
</bean>
/**
* SpringMVC方式的文件上传
*
* @param request
* @return
* @throws Exception
*/
@RequestMapping(value="/fileupload2")
public String fileupload2(HttpServletRequest request,MultipartFile upload) throws
Exception {
System.out.println("SpringMVC方式的文件上传...");
// 先获取到要上传的文件目录
String path = request.getSession().getServletContext().getRealPath("/uploads");
// 创建File对象,一会向该路径下上传文件
File file = new File(path);
// 判断路径是否存在,如果不存在,创建该路径
if(!file.exists()) {
file.mkdirs();
}
// 获取到上传文件的名称
String filename = upload.getOriginalFilename();
String uuid = UUID.randomUUID().toString().replaceAll("-", "").toUpperCase();
// 把文件的名称唯一化
filename = uuid+"_"+filename;
// 上传文件
upload.transferTo(new File(file,filename));
return "success";
}
SpringMvc跨服务器实现文件上传
1、导入需要的jar包
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-core</artifactId>
<version>1.18.1</version>
</dependency>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-client</artifactId>
<version>1.18.1</version>
</dependency>
@RequestMapping(value="/fileupload2")
public String fileupload3(MultipartFile upload) throws Exception {
System.out.println("SpringMVC跨服务器方式的文件上传...");
// 定义图片服务器的请求路径
String path = "http://localhost:9090/day02_springmvc5_02image/uploads/";
// 获取到上传文件的名称
String filename = upload.getOriginalFilename();
String uuid = UUID.randomUUID().toString().replaceAll("-", "").toUpperCase();
// 把文件的名称唯一化
filename = uuid+"_"+filename;
// 向图片服务器上传文件
// 创建客户端对象
Client client = Client.create();
// 连接图片服务器
WebResource webResource = client.resource(path+filename);
// 上传文件
webResource.put(upload.getBytes());
return "success";
Springmvc异常处理
1、自定义异常类,编写友好提示页面
2、自定义异常处理器,实现HandlerExceptionResolver接口,重写resolveException方法,处理异常逻辑
3、在配置页面配置异常处理器
!-- 配置异常处理器 -->
<bean id="sysExceptionResolver" class="cn.wfq.exception.SysExceptionResolver"/>
SpringMvc拦截器
1、SpringMVC框架中的拦截器用于对处理器进行预处理和后处理的技术
过滤器和拦截器的区别:
过滤器是Servlet规范的一部分,任何框架都可以使用过滤器技术。
拦截器是SpringMVC框架独有的。过滤器配置了/*,可以拦截任何资源。
拦截器只会对控制器中的方法进行拦截。 拦截器也是AOP思想的一种实现方式
2、自定义拦截器的步骤
创建类,实现HandlerInterceptor接口,重写需要的方法
/**
* 自定义拦截器1
* @author rt
*/
public class MyInterceptor1 implements HandlerInterceptor{
/**
* controller方法执行前,进行拦截的方法
* return true放行
* return false拦截
* 可以使用转发或者重定向直接跳转到指定的页面。
*/
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object handler)
throws Exception {
System.out.println("拦截器执行了...");
return true;
}
}
在springmvc.xml中配置拦截器类
<!-- 配置拦截器 -->
<mvc:interceptors>
<mvc:interceptor>
<!-- 哪些方法进行拦截 -->
<mvc:mapping path="/user/*"/>
<!-- 哪些方法不进行拦截
<mvc:exclude-mapping path=""/>
-->
<!-- 注册拦截器对象 -->
<bean class="cn.wfq.demo1.MyInterceptor1"/>
</mvc:interceptor>
</mvc:interceptors>
HandlerInterceptor接口中的方法介绍:
preHandle方法是controller方法执行前拦截的方法 可以使用request或者response跳转到指定的页面
return true放行,执行下一个拦截器,如果没有拦截器,执行controller中的方法。 3. return false不放行,不会执行controller中的方法。
postHandle是controller方法执行后执行的方法,在JSP视图执行前。 1. 可以使用request或者response跳转到指定的页面 2. 如果指定了跳转的页面,那么controller方法跳转的页面将不会显示。
afterCompletion方法是在JSP执行后执行 request或者response不能再跳转页面了

浙公网安备 33010602011771号