SpringMVC---进阶篇

[email protected]注解用于修饰方法,这个@ModelAttribute注解修饰的方法在我们每次请求目标方法之前都会被执行一次!

15.SpringMVC确定目标方法POJO类型入参的过程:

1.确定一个key:

1).若目标方法的POJO类型的参数木有使用@ModelAttribute作为修饰,则key为POJO类名第一个字母的小写。

2).若使用@ModelAttribute修饰,则key为@ModelAttribute注解的value属性值.

2.在implicitModel中查找key对应的对象,若存在,则作为入参传入。

1).若在@ModelAttribute标记的方法中在Map保存过,且key和1确定的key一致,则会获取到!

3.在implicitModel中不存在key对应的对象,则检查当前的Handler是否使用@SessionAttribute注解修饰,若使用了该主机,且@SessionAttributes注解的value属性值中包含了key,则会从HttpSession中来获取key所对应的value值,若存在则直接传入到目标方法的入参中,若不存在则将抛出异常。

4.若Handler没有标识@SessionAttributes注解或者@SessionAttributes注解的value值中不包含key,则会通过反射来创建POJO类型的参数,传入为目标方法的参数。

5.SpringMVC会把key和POJO对象保存到implicitModel中,进而会保存到request域中!

注意:[email protected]标记的方法,会在每个目标方法执行之前被SpringMVC调用!

   [email protected]注解可以来修饰目标方法POJO类型的入参,其value属性值有如下作用:

     1).SpringMVC会使用value属性值在implicitModel中查找对应的对象,若存在则会直接传入到目标方法的入参中

      2)SpringMVC会以value为key,POJO类型的对象为value,存入到request域中。

[email protected]注解只能标记在类上,可以使得多次请求共享某部一部分数据!

value:指定放入session域中键

types:指定放入Session域中的对象的字节码!

17.当出现遍历的情况我们就是用JSTL标签,

当我们使用下拉菜单及单选按钮、多选按钮的时候我们就使用springmvc提供的表单标签,

在表单标签中的path属性值相当于我们原生HTML中的name属性值!

  使用 Spring 的表单标签

  通过 SpringMVC 的表单标签可以实现将模型数据 中的属性和 HTML 表单元素相绑定,以实现表单数据更便捷编辑和表单值的回显。
  一般情况下,通过 GET 请求获取表单页面,而通过 POST 请求提交表单页面,因此获取表单页面和提交表单 页面的 URL 是相同的。只要满足该最佳条件的契 约,<form:form> 标签就无需通过 action 属性指定表单 提交的 URL

  可以通过 modelAttribute 属性指定绑定的模型属性,若 没有指定该属性,则默认从 request 域对象中读取 command 的表单 bean,如果该属性值也不存在,则会 发生错误
  SpringMVC 提供了多个表单组件标签,如<form:input/>、<form:select/> 等,用以绑定表单字段的属性值,它们的共有属性如下:
  – path:表单字段,对应 html 元素的 name 属性,支持级联属性
    form:input、form:password、form:hidden、form:textarea:对应 HTML 表单的 text、password、hidden、textarea标签
    form:radiobutton:单选框组件标签,当表单 bean 对应的 属性值和 value 值相等时,单选框被选中
    form:radiobuttons:单选框组标签,用于构造多个单选框
  –items:可以是一个 List、String[] 或 Map
  –itemValue:指定 radio 的 value 值。可以是集合中 bean 的一个 属性值
  –itemLabel:指定 radio 的 label 值
  –delimiter:多个单选框可以通过 delimiter 指定分隔符

  表单标签
     form:checkbox:复选框组件。用于构造单个复选框
     form:checkboxs:用于构造多个复选框。使用方式同 form:radiobuttons 标签
     form:select:用于构造下拉框组件。使用方式同 form:radiobuttons 标签
     form:option:下拉框选项组件标签。使用方式同 form:radiobuttons 标签
     form:errors:显示表单组件或数据校验所对应的错误
  – <form:errors path= “ *” /> :显示表单所有的错误
  –<form:errors path= “ user*” /> :显示所有以 user 为前缀的属性对应的错误
  –<form:errors path= “ username” /> :显示特定表单对象属性的错误

  当需要表单回显或者使用下拉列表的时候,就使用form表单标签,而如果使用遍历的标签就使用JSTL标签【导包】!

18.对于静态资源文件如【js/css/图片】的访问我们需要在spingmvc配置文件中配置一个标签,如下所示:

 <!-- 1.可以映射静态资源的访问请求 -->
     <mvc:default-servlet-handler/>

    <mvc:annotation-driven></mvc:annotation-driven>

19.   关于重定向

  一般情况下,控制器方法返回字符串类型的值会被当成逻辑视图名处理
  如果返回的字符串中带 forward: 或 redirect: 前缀时,SpringMVC 会对他们进行特殊处理:将 forward: 和 redirect: 当成指示符,其后的字符串作为 URL 来处理
    –redirect:/success.jsp:会完成一个到 success.jsp 的重定向的操作
    –forward:/success.jsp:会完成一个到 success.jsp 的转发操作

  视图解析器:
    图解析器的作用比较单一:将逻辑视图解析为一个具体 的视图对象。
    所有的视图解析器都必须实现 ViewResolver 接口

20.EmployeeCRUD:

SpringMVC处理静态资源【导入js文件】:

1.为什么出现这样的问题:

   优雅的REST风格的资源URL不希望带.html或.do等后缀,若将DispatcherServlet请求映射配置为/,

   则SpringMVC将捕获WEB容器的所有请求,包括静态资源的请求,SpringMVC会将他们当成一个普通请求处理,因此找不到对应处理器将导致错误。

2.解决:在SpringMVC的配置文件中配置<mvc:default-servlet-handler>

21.当需要表单回显或者使用下拉列表的时候,就使用form表单标签,而如果使用遍历的标签就使用JSTL标签【导包】!

22.视图和视图解析器【参见Springmvc如何解析视图流程图片】

请求处理方法执行完成后,最终返回一个 ModelAndView 对象。对于那些返回 String,View 或 ModeMap 等类型的处理方法,SpringMVC 也会在内部将它们装配成一个 ModelAndView 对象,它包含了逻辑名和模型对象的视图

  Spring MVC 借助视图解析器(ViewResolver)得到最终 的视图对象(View),最终的视图可以是 JSP ,也可能是Excel、JFreeChart等各种表现形式的视图

视图

    视图的作用是渲染模型数据,将模型里的数据以某种形式呈现给客户。

  视图对象由视图解析器负责实例化。由于视图是无状态的,所以他们不会有线程安全的问题。

  自定义视图

    1.自定义视图,实现view接口或者继承AbstractView抽象类,并加入到IOC容器中。

      2.在springmvc配置文件中配置BeanNameViewResolver视图解析器。

23.    数据格式化标签:

1.在SpringMVC配置文件中配置<mvc:annotation-driven/>

2.在目标POJO对象的属性上加上@NumberFormat 或者 @DateTimeFormat 注解!

@DateTimeFormat

–pattern 属性:类型为字符串。指定解析/格式化字段数据的模式, 如:”yyyy-MM-dd hh:mm:ss”

@NumberFormat

–pattern:类型为 String,自定义样式, 如patter="#,###";

24.数据类型转换以及数据格式化标签:

数据类型转换【了解】

1. 自定义类型转换器实现Converter<S,T>接口并加入到SpringMVC的IOC容器中,

 @Component
            public class EmployeeConverter implements Converter<String, Employee>{
                @Override
                public Employee convert(String source) {
                    System.out.println(source);
                    if(source != null){
                        String[] vals = source.split("-");
                        if(vals != null && vals.length ==5){
                            String name = vals[0];
                            String email = vals[1];
                            Integer gender = Integer.parseInt(vals[2]);
                            Department department = new Department();
                            department.setId(Integer.parseInt(vals[3]));
                            Employee employee = new Employee(null, name, email, gender, department);
                            return employee;
                        }
                    }
                    return null;
                }
            }

2.配置自定义转换器到FormattingConversionServiceFactoryBean工厂中!

 <!-- 将ConversionService再作为annotation-driven的一个属性存在! -->
            <mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven>

            <!-- 配置ConversionService -->
            <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
                <property name="converters">
                    <set>
                        <ref bean="employeeConverter"/>
                    </set>
                </property>
            </bean>

25.SpringMVC如何处理JSON数据?

1.加入json的3个jar包【导包】

jackson-annotations-2.1.5.jar

jackson-core-2.1.5.jar

jackson-databind-2.1.5.jar

2. 编写目标方法,使其返回 JSON 对应的对象或集合

3. 在方法上添加 @ResponseBody 注解

26.文件上传

Spring MVC 上下文中默认没有为文件上传提供了直接的支持,因 此默认情况下不能处理文件的上传工作,如果想使用 Spring 的文件上传功能,需现在上下文中配置 CommonsMultipartResovler:

1.加入jar包【导包】:

commons-fileupload-1.3.1.jar

commons-io-2.4.jar

2.在SpringMVC配置文件中配置CommonsMultipartResovler

        <!-- 配置CommonsMultipartResolver -->
        <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
            <property name="defaultEncoding" value="utf-8"></property>
            <!-- 以字节为单位 -->
            <property name="maxUploadSize" value="1024000<!--(文件大小)-->"></property>
        </bean>

2.表单:POST请求,file类型,enctype="multipart/form-data"

文件上传

    <form action="<!--(url)(请求路径) -->" method="post" enctype="multipart/form-data">         file:<input type="file" name="file"/>         <input type="submit" value="提交"/>
    </form>

          

 @RequestMapping(value="testUpload",method=RequestMethod.POST)
            public String testUpload(HttpServletRequest request,@RequestParam(value="desc",required=false) String desc,@RequestParam("photo") CommonsMultipartFile file) throws Exception{
                ServletContext servletContext = request.getServletContext();
                String realPath = servletContext.getRealPath("/upload");
                File file1 = new File(realPath);
                if(!file1.exists()){
                    file1.mkdir();
                }
                OutputStream out;
                InputStream in;
                //uuid_name.jpg
                String prefix = UUID.randomUUID().toString();
                prefix = prefix.replace("-","");
                String fileName = prefix+"_"+file.getOriginalFilename();
                System.out.println(fileName);

                out = new FileOutputStream(new File(realPath+"\\"+fileName));
                in = file.getInputStream();
                IOUtils.copy(in, out);
                out.close();
                in.close();

                return "success";

  

}

时间: 2024-11-08 16:20:52

SpringMVC---进阶篇的相关文章

Python之路【第十七篇】:Django【进阶篇 】

Python之路[第十七篇]:Django[进阶篇 ] Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接数据库,并编写数据访问层代码 业务逻辑层去调用数据访问层执行数据库操作 import MySQLdb def GetList(sql): db = MySQLdb.connect(user='root', db='wupeiqidb', passwd='1234', host='localhost')

Maya基础与建模教程 AE教程进阶篇 3DS MAX影视特效教程 Flash CS4案例教程

热门推荐电脑办公计算机基础知识教程 Excel2010基础教程 Word2010基础教程 PPT2010基础教程 五笔打字视频教程 Excel函数应用教程 Excel VBA基础教程 WPS2013表格教程 更多>平面设计PhotoshopCS5教程 CorelDRAW X5视频教程 Photoshop商业修图教程 Illustrator CS6视频教程 更多>室内设计3Dsmax2012教程 效果图实例提高教程 室内设计实战教程 欧式效果图制作实例教程 AutoCAD2014室内设计 Aut

在Horizon Workspace中配置Windows单点登录-进阶篇

在上一篇基础篇里面,简单介绍了在Horizon Workspace 1.8中如何配置Windows单点登录.在这篇博客中,会继续介绍一些针对大规模虚机或者虚拟桌面部署的配置方式.这些配置方式可以保证用模板部署出来的虚机或虚拟桌面在Workspace服务器端配置完成的情况下,不再需要用户进行手动配置就能实现HorizonWorkspace的单点登录. 1. 在模板机组策略中配置IE浏览器的设置 通过在模板虚拟机上的管理控制台中设置相应的策略,可以使后续使用模板机克隆出来的虚拟机自动使用Window

java web进阶篇(四) Tomcat数据源

动态web开发的最大特点是可以进行数据库的操作,传统的jdbc操作由于步骤重复性造成程序性能下降. 先来回顾JDBC的操作原理 1.加载数据库驱动程序,数据库驱动程序通过classpath配置. 2.通过DirverManager类取得数据库连接对象. 3.通过Connection实例化PreparedStatement对象,编写sql语句命令操作数据库. 4.数据库属于资源操作,操作完成后要关闭数据库以释放资源. 其实以上操作,1.2.4步骤是重复的,保留3,实际上就是数据源产生的原因. 数据

Python之路【第十七篇】:Django之【进阶篇】

Python之路[第十七篇]:Django[进阶篇 ] Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接数据库,并编写数据访问层代码 业务逻辑层去调用数据访问层执行数据库操作 import MySQLdb def GetList(sql): db = MySQLdb.connect(user='root', db='wupeiqidb', passwd='1234', host='localhost')

Python基础—面向对象(进阶篇)

通过上一篇博客我们已经对面向对象有所了解,下面我们先回顾一下上篇文章介绍的内容: 上篇博客地址:http://www.cnblogs.com/phennry/p/5606718.html 面向对象是一种编程方式,此编程方式的实现是基于对类和对象的使用: 类是一个模版,模板中包装了多个方法供使用(这里方法就是函数): 对象,根据模板创建的实例,实例用于调用被包装在类中的函数: 面向对象的三大特性:封装.继承.多态. 今天博客的内容主要介绍:Python类的成员.成员修饰符.类的特殊成员.异常处理和

ASP.NET MVC URL重写与优化(进阶篇)-继承RouteBase玩转URL

http://www.cnblogs.com/John-Connor/archive/2012/05/03/2478821.html 引言-- 在初级篇中,我们介绍了如何利用基于ASP.NET MVC的Web程序中的Global文件来简单的重写路由.也介绍了它本身的局限性-依赖于路由信息中的键值对: 如果键值对中没有的值,我们无法将其利用凑出我们想要的URL表达式. 初级篇传送门:使用Global路由表定制URL   在进阶篇中,我们将介绍ASP.NET 路由相关类的基类-抽象类RouteBas

Visual Studio调试之断点进阶篇

Visual Studio调试之断点进阶篇 在上一篇文章Visual Studio调试之断点基础篇里面介绍了什么是断点,INT 是Intel系列CPU的一个指令,可以让程序产生一个中断或者异常.程序中如果有中断或者异常发生了以后,CPU会中断程序的执行,去一个叫做IDT的部件查找处理这个中断(或者异常)的例程(Handler).IDT是操作系统在启动的时候初始化的,至于IDT的细节问题,例如什么是IDT,怎样编写一个IDT的例程,怎样 初始化IDT,可以去网上搜索一些资料. 总之,这里我们只要知

【VMCloud云平台】SCVMM进阶篇(一)网络虚拟化(2)

上一篇,我们讲了下最基本的SDN,就是使用CA地址的客户端如何去访问外部的网络?网络虚拟化里是否有类似"VLAN虚拟网关"的概念?还有PA跟CA到底之间具体的联系是如何实现的? 本篇涉及的网络架构由于是SCVMM进阶篇,就把SCVMM部分单独拿出来扩展,随着SCVMM进阶篇的推进,将会不断更新SCVMM架构图,图中Red.Blue两朵云分别代表租户的两个网络,Host-GW是用来做VMM网关(IP地址设置为23): 1. 上一篇中,我们创建了SC_NetWork作为主机间通信的&quo

SQL Server调优系列进阶篇(深入剖析统计信息)

前言 经过前几篇的分析,其实大体已经初窥到SQL Server统计信息的重要性了,所以本篇就要祭出这个神器了. 该篇内容会很长,坐好板凳,瓜子零食之类... 不废话,进正题 技术准备 数据库版本为SQL Server2008R2,利用微软的以前的案例库(Northwind)进行分析,部分内容也会应用微软的另一个案例库AdventureWorks 相信了解SQL Server的朋友,对这两个库都不会太陌生. 概念理解 关于SQL Server中的统计信息,在联机丛书中是这样解释的 查询优化的统计信