【SpringMVC】2.实战功能

1. 日期处理

  由于日期数据有很多种格式,springmvc 提供@DateTimeFormat注解,自动实现格式转换。

@DateTimeFormat(pattern="yyyy-MM-dd")
private Date ubirthday;
<input type="date" name="ubirthday">



2. 字符编码

  如果form表单提交方式为post,中文请求会出现乱码,底层默认采用的是“ISO8859-1”编码。

  可以在web.xml 中添加字符编码过滤器解决。

  <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>
	<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>

  如果响应的是JSON格式数据,spring4.3及以上版本默认就是UTF-8编码格式,无需特殊处理。



3. 文件上传
  • 配置虚拟目录
    在这里插入图片描述

  • 导入依赖的 jar 包
    在这里插入图片描述

  • 在配置文件 springmvc.xml 中配置文件上传处理器

<?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:aop="http://www.springframework.org/schema/aop"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
		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-4.3.xsd
		http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd">
  
	<!-- 开启注解自动扫描 -->
	<context:component-scan base-package="com.bodhixu.web" />
	<!-- 开启 MVC 注解驱动 -->
	<mvc:annotation-driven />	
	  
	<!-- 配置文件上传处理器  -->
	<bean id="multipartResolver"
		class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
		<!-- 设置文件上传大小,单位字节 -->
		<property name="maxUploadSize" value="5242880" />
	</bean>

</beans>
  • 修改 form 表单:regist.jsp

    ​ 提交方式为 “post”

    ​ enctype 格式为 “multipart/form-data”

    ​ input 类型为"file",name 属性名称必须和 Cotroller 中方法形参名称一致

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
	<form action="${pageContext.request.contextPath }/regist.action" 
			method="post" enctype="multipart/form-data">	
		姓名:<input type="text" name="name"><br>
		年龄:<input type="text" name="age"><br>
		头像:<input type="file" name="picFile"><br><br>	
		<input type="submit" value="注册"><br>	
	</form>
</body>
</html>
  • 在Controller的方法中处理文件上传

  在方法中接收文件的形参类型为 MultipartFile,形参名称必须和表单文件域名称一致。

@SessionAttributes(types=User.class)
@Controller
public class UserController {
	
	@RequestMapping("regist")
	public String regist(User user, MultipartFile headerFile) {
				
		// 获取文件名
		String oriName = headerFile.getOriginalFilename();
		// 获取图片后缀
		String suffix = oriName.substring(oriName.lastIndexOf("."));
		// 设置新文件名,可以使用uuid
		String picName = UUID.randomUUID().toString();
		// 设置保存文件的全路径
		String filePath = "E:" + File.separator + "img" + File.separator + picName + suffix;
		// 创建新图片文件
		File file = new File(filePath);

		// 开始图片上传
		try {
			headerFile.transferTo(file);
		} catch (IllegalStateException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
        
        // 设置头像地址
		user.setUheader(picName + suffix);
		
		// 将文件地址写入数据库,只需要写入 “文件名+后缀名”,略
				
		return "redirect:/jsp/login.jsp";
	}

}
  • 测试: login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h2>${user.uname }</h2>
	<h2>${user.uage }</h2>
	<img src="/img/${user.uheader }">
</body>
</html>



4. 全局异常处理

  系统的dao、service、controller出现异常如果未手动处理,就会通过throws Exception向上抛出,最后由前端控制器交由异常处理器进行异常处理,流程如下图:

在这里插入图片描述

  具体实现步骤:

  • 准备工作:在 Ctroller 中模拟异常
@Controller
public class CustomController {
	@RequestMapping("test")
	private String query() {				
		int x = 1/0;
		System.out.println(x);		
		return null;
	}		
}
  • 创建异常处理页面的 jsp,一般定义在 web-info 下
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Insert title here</title>
    </head>
    <body>
        <h2>系统发生异常</h2>
        <h4>异常信息为:${msg }</h4>
    </body>
</html>
  • 自定义异常处理器,需要实现 HandlerExceptionResolver 接口
@Component
public class CustomeExceptionResolver implements HandlerExceptionResolver{

	/**
	 * Object obj: 封装了异常发生的位置(包名.类名.方法名(参数))
	 * Exception e: 捕获到的异常对象
	 */
	@Override
	public ModelAndView resolveException(HttpServletRequest request, 
			HttpServletResponse response, Object obj, Exception e) {
		
		ModelAndView mv = new ModelAndView();
		mv.addObject("errorMsg", e.getMessage());
		mv.setViewName("/WEB-INF/jsp/error.jsp");
		
		return mv;
	}

}
  • 自定义异常处理器添加组件注解或者在配置文件中配置异常处理器



5. 拦截器

  Spring MVC 可以使用拦截器对请求进行拦截处理,用户可以自定义拦截器来实现特定的功能,自定义的拦截器必须实现 HandlerInterceptor 接口。


5.1 HandlerIntercepetor 接口

  • preHandle()

    ​ 在 Controller(业务处理器)处理请求之前被调用,在该方法中可以对用户请求进行处理。放行返回true,拦截返回false。可以在该方法中加入登录验证、权限拦截等。

  • postHandle()

  在 Controller 处理请求之后但是向客户端返回响应前(返回视图前)被调用。可以在该方法中对模型数据进行加工,比如加入一些公共信息等。

  • afterCompletion()

  在 Controller 处理请求之后并且向客户端返回响应后(返回视图)被调用。可以在该方法中获得异常信息,进行日志、资源清理的操作。

public class LoginInterceptor implements HandlerInterceptor{

	// 在Controller后并返回视图后调用
	@Override
	public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
			throws Exception {		
		System.out.println("afterCompletion....");
	}

	// 在Controller后返回视图前调用
	@Override
	public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
			throws Exception {
		System.out.println("postHandle....");		
	}

	// 在Controller前调用
	// 返回false-拦截, 返回true-放行
	@Override
	public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
		System.out.println("preHandle....");	
		return true;
	}

}

5.2 配置拦截器

	<!-- 配置拦截器 -->
	<mvc:interceptors>
		<mvc:interceptor>
			<!-- 拦截admin目录下所有,可以包含多层目录 -->
			<mvc:mapping path="/admin/**"/>
			<!-- 对应拦截器的全路径 -->
			<bean class="com.bodhixu.ssm.interceptor.LoginInterceptor"/>
		</mvc:interceptor>
		<!-- 可以配置多个拦截器 -->
	</mvc:interceptors>

5.3 案例:登录认证

  启动程序,默认进入后台主画面。如果未登录,自动跳转到登录画面。



6. 静态资源的处理

  如果将 DispatcherServlet 请求映射配置为 /,则 SpringMVC 将捕获 WEB 容器的所有请求,包括静态资源的请求,则类似于jquery.js等静态资源则加载失败。

  解决静态资源的问题,可以在 SpringMVC 的配置文件中配置如下:

<mvc:default-servlet-handler/>

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
***VC项目中,可以通过编写配置文件来实现具体的实战。首先,在SpringMVC的配置文件中,可以通过`<mvc:interceptors>`标签配置拦截器。拦截器可以用于在请求处理之前或之后执行一些操作,比如验证用户权限、记录日志等。在配置文件中,可以通过`<mvc:interceptor>`标签定义一个拦截器,并使用`<mvc:mapping>`标签指定拦截器的作用路径,使用`<mvc:exclude-mapping>`标签指定不需要拦截的路径。最后,需要在`<mvc:interceptors>`标签内将拦截器配置为一个bean。 此外,在SpringMVC中,可以使用`@Controller`注解标记一个类为SpringMVC的Controller对象。Controller对象负责处理请求,并将结果返回给客户端。可以使用`@RequestMapping`注解来指定处理请求的路径。另外,还可以使用其他注解来处理请求参数、处理响应、处理异常等。 综上所述,一个实战SpringMVC项目可以包括以下步骤: 1. 创建一个SpringMVC的配置文件,并在配置文件中配置拦截器。 2. 创建一个Controller类,并使用`@Controller`注解标记。 3. 在Controller类中使用`@RequestMapping`注解指定处理请求的路径。 4. 可以使用其他注解来处理请求参数、处理响应、处理异常等。 5. 部署项目并启动服务器,然后可以通过浏览器发送请求来测试项目的功能。 通过以上步骤,可以实现一个简单的SpringMVC项目,并进行实战开发。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [SpringMVC 实战](https://blog.csdn.net/qq_42588990/article/details/121076564)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值