一、HelloWorld程序

(1)导包:四个spring 核心包(core、beans、context、expression)、一个aop包、两个 web 包和一个logging 包;

(2)配置 web xml 就是配置一个 dispatcherServlet,设置开机自启,指定springmvc配置文件位置(init-param);

(3)配置springmvc文件,就是一个包扫描和一个视图解析器(前后缀),还有注解驱动的配置!!!

(4)写一个类用@controller 标记,其中的方法用@requestMapping来实现和url 的映射关系;

(5)出现 classnotfound,idea 环境下打开 projectstructure --problems--fix 即可;

(6)配置文件参考如下:

springmvc

org.springframework.web.servlet.DispatcherServlet

contextConfigLocation

/WEB-INF/dispatcher-servlet.xml

springmvc

/

二、注解开发

1、@requestMapping 注解

可以用在方法和类上,起到窄化请求的作用;

其中的属性还包含 method、param 和 header,都是更加精确请求的作用;

@PathVariable 注解指定 url 占位符(/hello/{name})和方法参数之间的映射;

2、参数相关注解

(1)@RequestParam注解

作用就是将请求参数映射到方法参数;

注解有三个属性:value(请求参数的名字)、required(默认为true)、defaultValue(请参的默认值);

请求参数名称和方法参数名称相同的时候不用设置value的值即可完成映射,不同的时候要设置 value 的值为请求参数的名称;

@RequestHeader 和 @CookieValue 注解:作用就是将请求头和cookie 的信息映射到方法的参数;注解的属性和用法都和requestParam 差不多;

(2)请求参数映射到 pojo

保证请求参数的名字和 pojo 的属性名一致即可自动完成映射,还支持级联属性;

名字不一则无法映射,相应的值为 null;

(3)方法参数还支持 servlet 的原生 API,支持的类型包括:

request、response、session、Principal

InputStream、outputStream、reader、writer

3、目标方法 pojo 类型入参过程

(1)@ModelAttribute注解:

这个注解标记的方法会在每个目标方法执行前被执行;

修饰目标方法参数:指定 pojo 的键名;

(2)pojo 入参过程

key 和 pojo 保存在 implicitModel 中,进而保存到 request 中;

第一步先去 implicitModel(map) 中去找,用默认的键名去匹配(类名首字母小写),当然也可以用 @ModelAttribute 指定键名去匹配,找到了就入参;

implicitModel 中的 pojo 对象来源于 @ModelAttribute 修饰的方法中存入到 map 中的 pojo 对象;

implicitModel 中找不到,当前的 Controller 又用了 @SessionAttributes 注解进行修饰的话,就去 session 中根据相应的键名去匹配,找到入参,没有则抛出异常;

如果没有 @SessionAttributes 或者键值不包括在注解的值里面的话,则会通过反射来创建一个新的 pojo 对象作为方法入参;

总结:键名----- implicitModel ------session-------(反射生成新对象)-------对象属性设置为相应的请求参数的值-------赋值给目标方法的参数

(3)使用 @sessionAttributes 注解抛出异常的解决方法

sessionAttributes 中的名称和方法参数 modelAttribute 中指定的名称不一致即可;

要么就是必须得有 modelAttribute  标记的方法,保证能够取到 sessionAttributes 名称对应的对象就不会抛异常;

干脆不用这个注解也可以;

4、模型数据处理

4.1 方法可以添加 Map 或者 Model 类型的参数

4.2 方法返回 ModelAndView

mv 可以包含视图和模型的信息;

最终这些数据都是存放到 request 域中;

4.3 再说 @sessionAttributes

注解的作用:就是将 request 域中的模型数据备份一份到 session,方便不同的请求之间共享;

使用时注意:这个注解是类注解,不能修饰方法;既可通过名称也可通过类型指定放到 session 中的数据(@SessionAttributes(value={"names"},types={Integer.class}));

示例请参考:https://www.cnblogs.com/caoyc/p/5635914.html

5、视图解析

5.1 视图解析流程

目标方法无论返回的是 string、model还是 mv,最终都是包装成 modelAndView返回;

视图的作用:渲染模型数据;

视图解析器的作用:将逻辑视图转换为物理视图;

常用的视图解析器:BeanNameViewResolver 和 InternalResourceViewResolver;配置多个解析器的话存在优先级的;

5.2 自定义视图和重定向

自定义视图:实现view 接口,重写 render 方法;最后还要在 springmvc 的配置文件中配置beanNameViewresolver,注意解析器的优先级;

转发和重定向:就是在 return 的 String 中加入前缀 forward: 或者 redirect:

view-controller 标签:view-controller 可实现直接将请求跳转到视图,不用经过 controller;

三、RESTful风格CRUD

1、CRUD 示例

新增:/order       post

删除:/order/1    delete

修改:/order/1    put

查询:/order/1    get

2、发送 put | delete 请求

web xml 中配置 HiddenhttpMethodFilter;

表单中增加一个 name=_method  value=delete 或 put 的隐藏域,发送 post 请求;

a 标签的 get 请求转 post ,js中用return false 阻止 a 标签默认行为,再通过 ajax 发送一个 post 请求即可;

3、表单标签|静态资源映射配置

3.1 spring 表单标签

自带数据的回显功能;

数据回显的前提是 form 的 commandName属性的值要和 request 域中存放的 pojo 对象的键值一致;

还支持级联属性的写法;

编号:
姓名:
余额:

3.2 静态资源映射配置

4、关于转发和重定向

controller 方法里 return String 默认是作为逻辑视图,要进行 controller 间的转发或者重定向要在前面加上 forward 和 redirect;

关于转发和重定向的路径问题:绝对路径(/)默认就是在当前的项目下,相对路径是在当前的controller 内;

四、数据处理

1、数据绑定(DataBinder)

(1)基本流程

(2)数据转换:springmvc 内置了很多类型转换器,一般情况下不需要我们自己写;

(3)自定义类型转换器

第一步:实现 Converter接口,重写方法实现想要的类型转换;

第二步:在 spring 的 ioc 容器中配置convertionService;

第三步:mvc:annotion-driven注解中配置 convertionService,将这个注册到 springmvc 的上下文中;

(4)关于mvc:annotation-driven

这个标签会自动注册RequestMappingHandlerMapping(处理器映射器) 、RequestMappingHandlerAdapter(处理器适配器)、ExceptionHandlerExceptionResolver(异常解析器) 三个bean;

此外还支持配置convertionService,还支持格式化注解(@NumberFormat annotation、@DateTimeFormat)验证注解(@Valid)请求响应体注解(@RequestBody 和 @ResponseBody)

(5)@InitBinder 注解

WebDataBinder 是 DataBinder 的子类,用于完成由表单字段到 JavaBean 属性的绑定 ;

@InitBinder 标识的方法,可以对 WebDataBinder 对象进行初始化;

@InitBinder方法不能有返回值,必须声明为void;

@InitBinder方法的参数通常是WebDataBinder;

@RequestMapping("object")

@ResponseBodypublicString object(User user,Admin admin) {return user.toString()+" "+admin.toString();

}

@InitBinder("user")public voidinitUser(WebDataBinder binder) {

binder.setFieldDefaultPrefix("user.");

}

@InitBinder("admin")public voidinitAdmin(WebDataBinder binder) {

binder.setFieldDefaultPrefix("admin.");

}

2、数据格式化

(1)使用前提

数据格式化相关的bean:FormattingConversionServiceFactroyBean;

默认创建的ConversionService 实例即为FormattingConversionServiceFactroyBean;

如果自定义类型转换器配置了 conversionService 一定要手动配置 FormattingConversionServiceFactroyBean;

(2)日期格式化和数值格式化示例(参考:https://www.cnblogs.com/dj-blog/p/7534907.html)

@DateTimeFormat(pattern="yyyy-MM-dd")privateDate birth;

@NumberFormat(pattern="#,###,###.#")private Float salary;

3、数据校验

(1)校验框架

JSR-303(Bean Validation) 是JAVAEE6中的一项子规范,用于 bean 数据合法性校验;

Hibernate Validator 是JSR303的参考实现,提供了 JSR 303 规范中所有内置 constraint 的实现,还有一些附加的 constraint;

(2)可以实现的校验

Constraint详细信息

@Null

被注释的元素必须为 null

@NotNull

被注释的元素必须不为 null

@AssertTrue

被注释的元素必须为 true

@AssertFalse

被注释的元素必须为 false

@Min(value)

被注释的元素必须是一个数字,其值必须大于等于指定的最小值

@Max(value)

被注释的元素必须是一个数字,其值必须小于等于指定的最大值

@DecimalMin(value)

被注释的元素必须是一个数字,其值必须大于等于指定的最小值

@DecimalMax(value)

被注释的元素必须是一个数字,其值必须小于等于指定的最大值

@Size(max, min)

被注释的元素的大小必须在指定的范围内

@Digits (integer, fraction)

被注释的元素必须是一个数字,其值必须在可接受的范围内

@Past

被注释的元素必须是一个过去的日期

@Future

被注释的元素必须是一个将来的日期

@Pattern(value)

被注释的元素必须符合指定的正则表达式

Hibernate Validator 独有的注解

@Email

被注释的元素必须是电子邮箱地址

@Length

被注释的字符串的大小必须在指定的范围内

@NotEmpty

被注释的字符串的必须非空

@Range

被注释的元素必须在合适的范围内

(3)校验的流程

实现数据校验的bean:LocalValidatorFactoryBean;

annotion-driven 会默认装配好一个 LocalValidatorFactoryBean;

在对应 pojo 的属性字段上加上校验注解;

在处理方法的入参上标注 @valid 注解,入参还可以加一个 bindingResult的参数;

需校验的 Bean 对象和其绑定结果对象bindingResult或错误对象时成对出现的,之间不允许有其他参数;

在方法里获取校验的结果(getFieldError、getFieldErrors、getFieldValue、getErrorCount);

在页面上显示错误( 错误信息会随一个隐含模型传到jsp,页面直接用就可以获取);

//bean里面的字段的写法

@NotEmptyprivateString lastName;

//controller方法入参的写法

@Valid Employee employee,BindingResult bindingResult

五、JSON处理--国际化--文件上传

1、json 处理

1.1 步骤

加入三个 jackson 的 jar(注意 jar 的版本);

写一个返回值为 json 对应的对象或集合的目标方法;

在目标方法加上 @responseBody 的注解;

@RequestMapping("/json")

@ResponseBodypublic ListtoJson(){

User[] users= {new User(1,"k1",100),new User(2,"k2",100)};return new ArrayList<>(Arrays.asList(users));

}

1.2 原理(通过 HttpMessageConverter 实现 java对象和json串的相互转换)

1.3 spring提供两种使用途径:

使用 @RequestBody(json转java对象)和 @ResponseBody(java对象转json)对目标方法进行标注;

使用 HttpEntity 和 ResponseEntity 作为目标方法的入参或者返回值;

2、国际化

2.1 国际化

​2.1.1 springmvc 配置文件

2.1.2 国际化资源文件

messages_zh_CN.properties文件:

language.cn=中文

language.en=英文

welcome=欢迎光临

messages_en_US.properties文件:

language.cn=Chinese

language.en=English

welcome=welcome to my house enjoy yourself

2.1.3 页面显示

国际化测试

language:locale:${pageContext.response.locale}

2.2 提示消息国际化

建一个国际化properties文件,里面错误的键名类似Pattern.user.password,值是要显示的消息;

在 spring 的ioc 容器里配置一个 messageSource 注册国际化资源文件;

2.3 jstlView

项目加入jstl 的jar,springmvc 自动将视图解析为 jstlView;

若要使用 jstl fmt 标签要在 springmvc 的配置文件中配置一个 messageSource;

3、文件上传

3.1 导入 commons io 和 fileupload 的包;

3.2 IOC 容器中配置 MultipartResolver 实现类;

3.3 controller 目标方法

@RequestMapping("/upload")public String upload(@RequestParam("file") MultipartFile file){if(file != null){try{

file.transferTo(new File("d:\\test\\"+file.getOriginalFilename()));

}catch(IOException e) {

e.printStackTrace();

}

}return "success";

}

3.4 上传页面:必须是post请求,必须设置 enctype

文件上传测试

选择文件:

java中springmvc_java框架之springmvc相关推荐

  1. java 中常用框架、intell idea简单使用、爬虫系统

    学习:http://www.ityouknow.com/spring-boot.html http://blog.didispace.com/spring-boot-learning-1/ ***in ...

  2. java中collection框架应用示例:学生选课系统

    java中集合框架概述 collection集合框架存储对象,有多个接口list,queue,set.他们对应的重要实现类分别是ArrayList,LinkedList,HashSet 定义类图 pu ...

  3. java中利用框架传入相同的url实现crud操作_Java SSM框架基础面试题

    1.Spring 在ssm中起什么作用? Spring:轻量级框架 作用:Bean工厂,用来管理Bean的生命周期和框架集成. 两大核心: 1.IOC/DI(控制反转/依赖注入) :把dao依赖注入到 ...

  4. java中对于框架的理解_接触Java项目一周后对一些基本框架的理解 | 学步园

    最近一周接触了一个Java EE的B/S项目,里面用到了SSH,部分持久层用的是ibatis,接触完后觉得有收获,于是把认识到的记录下来.同时欢迎高手拍砖. 现在终于知道所谓的三层框架(视图层,业务逻 ...

  5. java中利用框架传入相同的url实现crud操作_还在手写CRUD代码?这款开源框架助你解放双手!

    相信很多朋友在项目中使用的ORM框架都是MyBatis,如果单用MyBatis来操作数据库的话,需要手写很多单表查询的SQL实现.这时候我们往往会选择一个增强工具来实现这些单表CRUD操作,这里推荐一 ...

  6. Java中SSM框架解决跨域请求

    方法一:@CrossOrigin注解的方法,只能作用在一个Controller层 直接在Controller类或方法前加上@CrossOrigin注解即可允许所有ip跨域访问 加在Controller ...

  7. java如何遍历combobox_如何通过COMBOBOX设置Java中的框架标题?

    我想创建类似下图的内容,当用户从组合框选项中选择年份.月份和日期时,这些操作将更改标题,并且必须根据所选数据进行更改,这很简单,我还是新手 到目前为止,我已经做到了,问题是它不起作用,我怎么能做到呢? ...

  8. java中ares框架_ARES辅助开发工具-用户手册.doc

    ARES辅助开发工具-用户手册 ARES辅助开发工具 用户手册 第1章产品概述5 第2章安装.更新6 2.1安装6 2.2更新6 第3章ARES框架介绍6 3.1请求6 3.2动作6 3.3对象资源7 ...

  9. java 异步i o_在Java中播放框架异步处理和阻塞I / O

    我建议您设置自己的上下文,并使用Plays F.Promise& A>运行您的阻止/ cpu密集型操作.与线程一样,最优解决方案取决于许多内核等等. 首先在applications.co ...

  10. java 按键框架,如何在java中更改框架?

    Let's say there is a button and if you will click that, a new frame will appear and so on... 解决方案 Th ...

最新文章

  1. HDU 1231 最大连续子序列
  2. 用-force –opengl 指令_苹果新系统ios14新功能汇总 轻点背面等小技巧怎么用
  3. c语言一个整数各位数字个数_C语言实现把字符串中的数字转换成整数
  4. carplay是否可以用安卓系统_是否可以仅用键盘来操作Windows 10系统和Windows 10应用?...
  5. Cannot call sendError() after the response has been committed
  6. 「服务端」node服务的监控预警系统架构
  7. Elasticsearch5.X Mapping万能模板
  8. 【渝粤题库】陕西师范大学291003综合英语(三)作业(高起专、高起本)
  9. mysql 时间计算函数_MySQL时间计算函数DATE_SUB()用法简介说明
  10. MySql详解(四)
  11. Cocos Creator 使用 Android Studio 打包 APK 遇到的坑
  12. JavaScript Date Format
  13. PhoneGap + Dreamweaver 5.5 无法在模拟器中打开的问题
  14. Python爬虫实战(二):爬取快代理构建代理IP池
  15. Python 乌龟吃鱼问题求解
  16. 密码模块安全技术要求
  17. 光纤、光缆的基本知识(2)
  18. android ViewPager轮播制作成品——轮播制作(六)
  19. OBS 进阶 之 高分屏下 屏幕采集不全问题解决
  20. 百度网盘开放平台接口,上传、下载等功能PHP详细操作

热门文章

  1. ERROR 1290 (HY000): The MySQL server is running withnbs
  2. 130242014057 周陈清 实验一
  3. js通过codeURL画二维码
  4. SQLite不同插入方法的效率对比测试
  5. Web API框架学习——消息管道(二)
  6. Qt中图片调用(2)
  7. (转)基于.Net的单点登录(SSO)解决方案(1)
  8. 【转】HTML标签大全
  9. 生鲜电商之毒,食行生鲜模式虽好、恐也难解
  10. Java并发编程之原子类