SpringMVC的特性及应用
Spring MVC特点
- 清晰地角色划分
- 灵活的配置功能
- 提供了大量的控制器接口和实现类
- 真正的View层实现无关(JSP、Velocity、Xslt等)
- 国际化支持
- 面向接口编程
- Spring提供了Web应用开发的一整套流程,不仅仅是MVC,他们之间可以很方便的结合一起
视图解析器
- 将逻辑视图的名字与JSP等视图技术进行匹配
- InternalResourceViewResolver
- 在Web应用程序的WAR文件中查找视图模板,视图模板的路径根据加完前缀和后缀的逻辑视图名称来确定
- prefix
- suffix
REST风格
- Representational State Transfer表述性状态转移
- 传统的查、改、删的URL与REST风格的增删改URL对比
- /userview.action?id=12 VS /user/12
- /userdelete.action?id=12 VS /user/12/delete
- /userupdate.action?id=12 VS /user/12/update
- 请求方式
- GET
- POST
- DELETE
- PUT
- 他强调的是一个资源可以对应多种视图
配置步骤:
1.导入spring-web类库,
2.配置web.xml:
<servlet>
<!--注意这里的名字会被spring.xml文件名引用(springMVC-servlet.xml)-->
<servlet-name>springMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>springMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
乱码处理:
<filter>
<filter-name>encodingFilter</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>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
3.配置<springMVC>-servlet.xml,放在和web.xml同目录
方式一:BeanNameUrlHandlerMapping方式:
<!-- 控制器bean,name为访问此控制器用的url,class为继承AbstractController的控制器类 -->
<bean name="/index.html" class="com.zhp.controller.HelloController"></bean>
<!-- 视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
方式二:DefaultAnnotationHandlerMapping注解方式:
<context:component-scan base-package="com.zhp.*"/>
<mvc:annotation-driven/>
视图解析器如上相同
4.跳转:
方式一:ModelAndView mav = new ModelAndView("hello");//hello会结合试图解析器的前缀和后缀来确定url
方式二:注解时,直接return "hello";即可
5.接收参数:
login(String uname)可以直接通过uname=zhang来传参
reg(@ModelAttribute Usertbl user)通过注解也可自动封装对象
Rest风格:
@RequestMapping("/update/{username}")
public String update(@PathVariable String username)//注意注解@PathVariable
6.转发数据:
方式一:通过方法中参数Model:
public String login(Model model){
model.addAttribute("uname","zhang");//页面通过${requestScope.uname}取出
}
方式二:session对象的获取:自动注入session对象
public String login(@ModelAttribute Usertbl user,Model model,HttpSession session){}
注意:页面传递参数:
1.Model----model.addAttribute("upass",upass);
2.Map<String,Object>---------map.put("user", user);
3.HttpSession----session.setAttribute("name", uname);
注意:如果指定了提交方式method=RequestMethod.GET/method=RequestMethod.POST时,springMVC会根据页面的提交方式判断提交的;
7.数据校验
JSR-303 是Java EE 6 中的一项子规范,叫做Bean Validation,官方参考实现是Hibernate Validator。
此实现与Hibernate ORM 没有任何关系。JSR 303 用于对Java Bean 中的字段的值进行验证。
spring MVC 3.x之中也大力支持 JSR-303,可以在控制器中对表单提交的数据方便地验证。
8.异常处理
a.局部处理:
//运行时异常处理
@ExceptionHandler(value=RuntimeException.class)
public String doException(RuntimeException e){
System.out.println("---RuntimeException---异常了-----"+e.getMessage());
return "error";
}
// 非运行时异常处理
@ExceptionHandler(value=Exception.class)
public String doException(Exception e){
System.out.println("---Exception---异常了-----"+e.getMessage());
return "error";
}
b.全局处理:
<!-- 异常解析器 -->
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<prop key="java.lang.Exception">error</prop>
</props>
</property>
</bean>
9.静态资源处理:
将静态文件指定到某个特殊的文件夹中统一处理
<mvc:resources mapping="/resources/**" location="/resources/" />
注意:mapping="/resources/**":表示映射路径,在页面应用resources映射名
location="/resources/":表示文件存放的真实路径
10.文件上传
a.导入文件上传夹包:commons-fileupload-1.2.2.jar、commons-io-2.4.jar
b.配置文件:<!-- 配置MultipartResolver,用于上传文件,使用spring的CommonsMultipartResolver -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="5000000"/>
<property name="defaultEncoding" value="UTF-8"/>
</bean>
c.编写页面:<form action="upload" method="post" enctype="multipart/form-data">
<input type="submit" value="上传">
d.编写控制器类:
@Controller
public class ProductAction {
@RequestMapping("/upload")
public String upload(Product product,@RequestParam MultipartFile pic,HttpSession session){
System.out.println(pic.getOriginalFilename()+"------upload-----"+product);
//获取工程路径
String savePath=session.getServletContext().getRealPath("resources/upload");
//获取上传文件名称
String fileName=pic.getOriginalFilename();
File saveFile=new File(savePath, fileName);
//封装到对象
product.setImgSrc(fileName);
try {//实现上传,以拷贝输入流的方式实现
FileUtils.copyInputStreamToFile(pic.getInputStream(), saveFile);
} catch (IOException e) { e.printStackTrace(); }
return "index";
}
// 多文件上传
@RequestMapping("/uploads")
public String uploads(Product product,@RequestParam MultipartFile[] pic,HttpSession session){
//获取工程路径
String savePath=session.getServletContext().getRealPath("resources/upload");
for (int i = 0; i < pic.length; i++) {
//获取上传文件名称
String fileName=pic[i].getOriginalFilename();
File saveFile=new File(savePath, fileName);
try { //springMVC提供文件拷贝
pic[i].transferTo(saveFile);
} catch (IOException e) { e.printStackTrace();}
}
return "index";
}
}
11.SpringMVC中的JSON
@Controller
public class ProductController {
@Resource(name="service")
private ProductService service;
@RequestMapping(value="/query/{id}",method=RequestMethod.GET)
@ResponseBody
public Product query(@PathVariable int id){
Product prod=service.getProductById(id);
return prod;
}
}
对应前台js:
<script type="text/javascript" src="resources/js/jquery-1.9.1.js"></script>
<script type="text/javascript">
$(document).ready(function(){
$(":button").click(function(){
var id=$("[name=pid]").val();
$.getJSON("query/"+id,"",function(data){
if(data!=null && data!=""){
$("#show").html("商品编号:"+data.pid+"<br>商品名称:"+data.pname+"<br>商品价格:"+data.price);
}
});
});
});
</script>
SpringMVC的特性及应用的更多相关文章
- springMVC的详解
一,springmvc注解特性 1.@Controller 控制器定义在 spring 3.0 中,通过@controller 标注即可将 class 定义为一个 controller 类.为使 sp ...
- ContextLoaderListener可以不写嘛?
写了那么久的Spring,经常写这样的配置,这就是几行Spring.SpringMvc的基本配置, 但是最近也看到不写最前面的context-param以及listener的,好奇记录下. <c ...
- XSS攻击防御篇
前言 上篇文章中提到了 XSS 攻击,而且,也从几个方面介绍了 XSS 攻击带来的严重影响.那么,这篇文章中,主要是针对 XSS 攻击做一个基本的防御,看看可以通过几种方式来修复这个特别常见的安全 ...
- Springboot注解使用总结
使用Spring boot已经有段时间了,但是对很多注解的使用经常会遇到模糊甚至不解的地方,这次有时间便总结一下. 注解(Annotation)概念 注解是Java5开始对元数据的支持,注解与注释是有 ...
- Spring4新特性——集成Bean Validation 1.1(JSR-349)到SpringMVC 配置校验器
Spring4新特性——泛型限定式依赖注入 Spring4新特性——核心容器的其他改进 Spring4新特性——Web开发的增强 Spring4新特性——集成Bean Validation 1.1(J ...
- Spring4新特性——集成Bean Validation 1.1(JSR-349)到SpringMVC
在之前的<跟我学SpringMVC>中的<第七章 注解式控制器的数据验证.类型转换及格式化>中已经介绍过SpringMVC集成Bean Validation 1.0(JSR-3 ...
- springMVC第二天——高级参数绑定与其它特性
大纲摘要: 1.高级参数绑定 a) 数组类型的参数绑定 b) List类型的绑定 2.@RequestMapping注解的使用 3.Controller方法返回值 4.Springmvc中异常处理 5 ...
- 转:SpringMVC 4.1 新特性(二)内容协商视图
SpingMVC的内容协商支持三种方式: 使用后缀,如json.xml后缀和处理类型的关系可以自己定义 前面说的使用Accept头 在访问时request请求的参数,比如每次请求request都会加f ...
- SpringMVC视图解析器
SpringMVC视图解析器 前言 在前一篇博客中讲了SpringMVC的Controller控制器,在这篇博客中将接着介绍一下SpringMVC视 图解析器.当我们对SpringMVC控制的资源发起 ...
- springmvc<一>一种资源返回多种形式【ContentNegotiatingViewResolver】
restful服务中一个重要的特性就是一种资源可以有多种表现形式,在springmvc中可以使用ContentNegotiatingViewResolver这个视图解析器来实现这种方式. 描述资源的三 ...
随机推荐
- spring报错-Caused by: java.lang.IllegalArgumentException: Unsupported class file major version 63
这个错误原因是因为JDK版本过高,改一下版本就行了 把里面的19改成8 这样就行了
- 10个必备的 async/await 工具函数
| 当谈到异步编程时,async/await是JavaScript中常用的功能之一.下面是10个常用的await和async函数示例,以及对它们的代码用途的解析: 1.异步获取数据 async fun ...
- 服务网格 Service Mesh
什么是服务网格? 服务网格是一个软件层,用于处理应用程序中服务之间的所有通信.该层由容器化微服务组成.随着应用程序的扩展和微服务数量的增加,监控服务的性能变得越来越困难.为了管理服务之间的连接,服务网 ...
- C++ Qt开发:SqlTableModel映射组件应用
Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍SqlTabl ...
- 文心一言 VS 讯飞星火 VS chatgpt (171)-- 算法导论13.2 4题
四.用go语言,证明:任何一棵含n个结点的二叉搜索树可以通过 O(n)次旋转,转变为其他任何一棵含n个结点的二叉搜索树.(提示:先证明至多n-1次右旋足以将树转变为一条右侧伸展的链.) 文心一言: 这 ...
- 深度解析 PyTorch Autograd:从原理到实践
本文深入探讨了 PyTorch 中 Autograd 的核心原理和功能.从基本概念.Tensor 与 Autograd 的交互,到计算图的构建和管理,再到反向传播和梯度计算的细节,最后涵盖了 Auto ...
- libGDX游戏开发之NPC敌人事件(六)
libGDX系列,游戏开发有unity3D巴拉巴拉的,为啥还用java开发?因为我是Java程序员emm-国内用libgdx比较少,多数情况需要去官网和google找资料,相互学习的可以加我联系方式. ...
- 昇腾实战丨DVPP媒体数据处理图片解码问题案例
摘要:本期就分享几个关于DVPP图片解码问题的典型案例,并给出原因分析及解决方法. 本文分享自华为云社区<DVPP媒体数据处理图片解码问题案例>,作者:昇腾CANN . DVPP(Digi ...
- 原来AI也可以如此简单!教你从0到1开发开源知识问答机器人
摘要:使用华为云EI智能机器人技术,从0到1开发一款开源知识问答机器人. 前言 最近有幸参与了开源社开源问答机器人的知识库编写,碰巧看到华为云也有类似的智能机器人,抱着试一试的心态,我开始了EI智能机 ...
- 软件界旷世之架:测试驱动开发(TDD)之争
摘要:在软件行业中,神仙打架的名场面,那就不得不提的是2014年的那场--测试驱动开发(TDD)之争. 在历史上有很多精彩绝伦的神仙打架,比如数学界的牛顿和莱布尼茨关于微积分的旷世之争:比如量子物理中 ...