Chapter07 SpringMVC高级技术

7.1 SpringMVC的环境搭建方式

Java配置方式
全局配置

public class SpitterWebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer
{/*** Spring上下文配置* ContextLoaderListener* @Author NikoBelic* @Date 09/01/2017 20:40*/@Overrideprotected Class<?>[] getRootConfigClasses() {return new Class<?>[]{RootConfig.class};}/*** SpringMVC上下文配置* DisparcherServlet* @Author NikoBelic* @Date 09/01/2017 20:41*/@Overrideprotected Class<?>[] getServletConfigClasses() {return new Class<?>[]{WebConfig.class};}/*** SpringMVC请求拦截,将DispatcherServlet映射到/* @Author NikoBelic* @Date 09/01/2017 20:41*/@Overrideprotected String[] getServletMappings() {return new String[]{"/"};}/*** 配置文件上传限制* @Author NikoBelic* @Date 09/01/2017 20:40*/@Overrideprotected void customizeRegistration(ServletRegistration.Dynamic registration) {registration.setMultipartConfig(new MultipartConfigElement("/Users/lixiwei-mac/Desktop/tmp",20971520, 41943040, 0));}
}

Spring上下文配置(ContextLoaderListener)

/*** @author NikoBelic* @create 09/01/2017 20:30*/
//@Configuration
@ComponentScan(basePackages = "chapter07",excludeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION,value = EnableWebMvc.class)})
public class RootConfig
{}

SpringMVC配置(DispatcherServlet)

@Configuration
@EnableWebMvc
@ComponentScan("chapter07.controller")
public class WebConfig extends WebMvcConfigurerAdapter
{/*** 配置视图解析器* @Author NikoBelic* @Date 09/01/2017 20:37*/@Beanpublic ViewResolver viewResolver(){InternalResourceViewResolver resolver = new InternalResourceViewResolver();resolver.setPrefix("/WEB-INF/views/");resolver.setSuffix(".jsp");resolver.setExposeContextBeansAsAttributes(true);resolver.setViewClass(JstlView.class);return resolver;}/*** 配置静态资源的处理* @Author NikoBelic* @Date 09/01/2017 20:37*/@Overridepublic void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {configurer.enable();}/*** 配置文件上传解析器* @Author NikoBelic* @Date 09/01/2017 20:38*/@Beanpublic MultipartResolver multipartResolver() throws IOException {return new StandardServletMultipartResolver();}}

XML配置方式(略) 可以参考前几章

7.2 处理Multipart文件上传

web相关配置已经包含在7.1中

jsp页面

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="sf" uri="http://www.springframework.org/tags/form" %>
<%@ page isELIgnored="false" %>
<%@ page session="false" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>RegisterForm</title>
</head>
<body>
<h1>Register</h1>
<%--这里Form表单没有设置action,因此他会将请求提交到与展现时相同的URL路径上--%>
<form method="post" enctype="multipart/form-data">Username:<input type="text" name="username"/><br/>Password:<input type="password" name="password"/><br/>FirstName:<input type="text" name="firstName"/><br/>LastName:<input type="text" name="lastName"/><br/>ProfilePic:<input type="file" name="profilePic" accept="image/jpeg,image/png,image/gif"/><br/><input type="submit" value="Register"/>
</form>使用Spring表单绑定标签
<%--<sf:form method="post" commandName="spitter">--%><%--Username:<sf:input path="username"/><br/>--%><%--Password:<sf:password path="password"/><br/>--%><%--<input type="submit" value="Register">--%>
<%--</sf:form>--%>
</body>
</html>

控制器

@Controller
@RequestMapping(value = "weibo")
public class WeiboController
{/*** 跳转到注册界面* @Author NikoBelic* @Date 09/01/2017 22:35*/@RequestMapping(value = "/register",method = RequestMethod.GET)public String showRegister(){return "weibo/register";}/*** 处理注册流程* @Author NikoBelic* @Date 09/01/2017 22:36*/@RequestMapping(value = "/register",method = RequestMethod.POST)public String processRegister(@RequestPart("profilePic")MultipartFile profilePic, @Valid Spitter spitter, Errors errors, RedirectAttributes model) throws IOException, DuplicateException{profilePic.transferTo(new File("/Users/lixiwei-mac/Desktop/data/" + profilePic.getOriginalFilename()));System.out.println(spitter);if (spitter.getUsername().equals("dup"))throw new DuplicateException();model.addAttribute("username",spitter.getUsername());model.addAttribute("password",spitter.getPassword());model.addFlashAttribute(spitter);return "redirect:/weibo/profile/{username}";}@RequestMapping(value = "/profile/{username}",method = RequestMethod.GET)public String profile(@PathVariable("username") String username,String password,Model model){System.out.println(username);System.out.println(password);System.out.println(model.containsAttribute("spitter"));return "profile";}/*** 控制器异常处理* @Author NikoBelic* @Date 10/01/2017 08:51*///@ExceptionHandler(DuplicateException.class)//@ResponseBody//public String handleDuplicateException()//{//    return "error/duplicate";//}}

customizeRegistration配置指定了临时文件的存储地址(传输完毕后会自动清除)

7.3 处理异常

使用@ExceptionHandler可以处理Controller抛出的异常,异常出现后可以跳转到更加友好的提示界面。@ControllerAdvice作为一个Controller的全局配置,对所有@Controller注解的@RequestMapping方法生效。

@ControllerAdvice
public class AppWideExceptionHandler
{@ExceptionHandler(DuplicateException.class)public String duplicateSpittleHandler(){return "error/duplicate";}
}

7.4 跨重定向传递数据

redirect:将客户端的请求以get方式重定向到另一个controller,可以用${}路径和?参数的方式传递简单数据,但是无法传输Spitter这样的对象。重定向后模型中的数据将会丢失。
forward:将客户端的请求转发到另外一个页面,保留原有的模型数据,但是浏览器地址不会发生改变,因为浏览器不知道自己的请求被转发了。

如果需要使用redirect并想保留model中的数据,可以使用flash属性。使用RedirectAttributes作为model,它会将模型暂存到session中,重定向后可以使用Model取出对应的对象。我们也可以不借助Spring提供的这个方法,自己将对象存储到session中,转发后在从session中取出并清空session。

Spring学习笔记-C7-SpringMVC高级技术相关推荐

  1. java mvc框架代码_JAVA技术学习笔记:SpringMVC框架(内附入门程序开发代码)

    原标题:JAVA技术学习笔记:SpringMVC框架(内附入门程序开发代码) JavaEE体系结构包括四层,从上到下分别是应用层.Web层.业务层.持久层.Struts和SpringMVC是Web层的 ...

  2. 一箭双雕 刷完阿里P8架构师spring学习笔记+源码剖析,涨薪8K

    关于Spring的叙述: 我之前死磕spring的时候,刷各种资料看的我是一头雾水的,后面从阿里的P8架构师那里拿到这两份资料,从源码到案例详细的讲述了spring的各个细节,是我学Spring的启蒙 ...

  3. Spring学习笔记(三) AOP_annotation,AOP_XML

    在学习课程以前,听说AOP有种很神秘的感觉,好像很好深的技术.其实原理很简单,使用动态代理的方式给程序增加逻辑.与此相似的有struts2中的filter拦截器. 再讲AOP之前先把需求说一下: 同S ...

  4. Spring学习笔记:第一个Spring Boot程序HelloWorld

    Spring学习笔记:第一个Spring Boot程序HelloWorld 一.跟着 Spring 了解技术趋势 1.看看 Spring 5.x 的改变暗示了什么 2.Spring Boot 和 Sp ...

  5. 【Spring学习笔记 九】Spring声明式事务管理实现机制

    什么是事务?事务就是把一系列的动作当成一个独立的工作单元,这些动作要么全部完成,要么全部不起作用,关乎数据准确性的地方我们一定要用到事务,防止业务逻辑出错. 什么是事务管理,事务管理对于企业应用而言至 ...

  6. java jdk 8学习笔记,Java JDK 8学习笔记 PDF_源雷技术空间

    资源名称:Java JDK 8学习笔记 PDF 内容简介: ●本书是作者多年来教学实践经验的总结,汇集了学员在学习课程或认证考试中遇到的概念.操作.应用等问题及解决方案 ●针对Java SE 8新功能 ...

  7. 【学习笔记】大数据技术之Scala(下)

    [学习笔记]大数据技术之Scala(上) 大数据技术之Scala 第 6 章 面向对象 6.1 Scala 包 6.1.1 包的命名 6.1.2 包说明(包语句) 6.1.3 包对象 6.1.4 导包 ...

  8. JavaEE——Spring学习笔记03【AOP开发】

    JavaEE--Spring学习笔记01[Ioc开发的模式] JavaEE--Spring学习笔记02[Spring和Mybatis的整合] JavaEE--Spring学习笔记03[AOP开发] J ...

  9. JavaEE——Spring学习笔记01【Ioc开发的模式】

    JavaEE--Spring学习笔记01[Ioc开发的模式] JavaEE--Spring学习笔记02[Spring和Mybatis的整合] JavaEE--Spring学习笔记03[AOP开发] J ...

  10. 【计算机网络学习笔记18】防火墙技术、入侵检测技术

    [计算机网络学习笔记18]防火墙技术.入侵检测技术 一.防火墙 防火墙 (firewall) :一种访问控制技术,通过严格控制进出网络边界的分组,禁止任何不必要的通信,从而减少潜在入侵的发生,尽可能降 ...

最新文章

  1. Python os.chdir() 方法用于改变当前工作目录到指定的路径。
  2. 示波器上mode选择开关上的norm和auto是什么意思?
  3. linux 脏牛提权 cve-2016-5159
  4. 【DIY】自己动手更换热水器镁棒,保养电加热热水器注意事项,电热水器镁棒多久更换一次实际数据参考...
  5. 移动端视频缓存保障与CDN调度优化
  6. Halcon学习笔记(一):Qt+Halcon联合开发配置
  7. 合并果子(信息学奥赛一本通-T1369)
  8. mysql 存储过程 排序_mysql存储过程排序
  9. python绘图背景透明_如何在 Matplotlib 中更改绘图背景
  10. 使用@AspectJ注解开发Spring AOP
  11. Linux用管道移动文件夹,linux常用命令(示例代码)
  12. paraview用户指南
  13. 计算机CPU高温,电脑cpu温度高怎么办?别怕,三招搞定
  14. (openCV 十二)图像增强(对数变换/伽马变换/分段线性变换)
  15. 将markdown文档转化为pdf格式
  16. 【方法】Chrome如何下载视频
  17. PDF怎么删除空白页,PDF删除空白页的方法
  18. 什么蓝牙耳机好用?2022蓝牙耳机排行榜
  19. 可编辑div的一些方法总结(二)自定义空格和回车事件
  20. 计算机的应用给我们带来了,电脑能给我们的生活带来哪些便利

热门文章

  1. 听风辨器,神功护体——IT运维人员的九阳神功(中)
  2. 毕业季,既是告别,也是新的开始
  3. Android开发实例详解之IMF
  4. maven - filtering标签
  5. maven中filtering的使用
  6. [鸿篇巨制]蚂蚁金融级分布式架构SOFAStack编年史
  7. IBM沃森Watson答题过程全揭秘
  8. windows2016服务器优化,Windows server 2016性能调优问题
  9. 原生JS写一个首字母排序的通讯录效果
  10. php实现的简单问卷调查系统