SpringMvc总结

SpringMVC总结

1、开发服务器端程序,一般都是基于两种形式,一种是C/S架构程序,一种是B/S架构程序

2、java语言基本上都是开发B/S架构程序,B/S架构程序又分为三层架构:

  • 表现层:WEB层,用来和客户端浏览器进行数据交互的,表现层一般会才用MVC的设计模型
  • 业务层:处理项目具体的业务逻辑,实现业务逻辑功能
  • 持久层:用来操作数据库的

3、MVC设计模型:

  1. MVC全名是:model view controller 模型视图控制器 ,每个部分各司其职
  2. model:数据模型,javabean,entity类,用来接收和返回数据
  3. view:指jsp、html用来展示数据给用户
  4. 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 配置文件中的标签 , 如果遇到 ajax 请求仍然乱码,请把: useBodyEncodingForURI="true"改为 URIEncoding="UTF-8" 即可。

自定义类型转换器

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不能再跳转页面了

posted @ 2021-12-05 23:20  做笔记很重要  阅读(252)  评论(0)    收藏  举报