@RequestMapping
处理器映射器之所以能够从浏览器地址中将对应的地址映射出来,取决于 @RequestMapping 注解的value属性
因为前端控制器的匹配模式是 *.action 所以对于处理器映射器而言,请求能到达处理器映射器,肯定后缀名都是 .action 所以路径中不写的 官网:www.fhadmin.org .action 可以省略规范起见还是加上
多个路径匹配
其value属性是数组,可以同时匹配多个映射路径
简化路径
如果当前类中的所有的路径的前缀都是相同的,官网:www.fhadmin.org 那么可以使用@RequestMapping配置在类的上方,以下所有的方法都可以省去前面的那个路径。
限定请求方法
可以通过@RequestMapping限定是GET请求还是POST请求,使用其method属性(是数组,也就是可以同时设置多个方式),属性类型是RequestMethod 官网:www.fhadmin.org(枚举类型)
注意:页面出现405错误表示没有对应请求的set或get方法,如果出现错误,首先排查此项
controller方法的返回值
对于controller方法的返回值我们可以使用3中类型的返回值
ModelAndView
返回数据和页面,其内部的原理是:数据放在Request域中,页面通过内部转发得到,我们之前一直使用的是这种类型,使用对象的addObject添加数据,使用
serViewName
官网:www.fhadmin.org 设置视图
void返回值
> 如果返回值是void,则意味着请求处理完成后不会进行页面跳转,如果想要进行页面跳转,可以使用参数中的request和response(与其原生态的servlet跳转)还不如不将返回值设置为void 官网:www.fhadmin.org
// 1 使用request进行转发request.getRequestD
ispatcher("/WEB-INF/jsp/success.jsp").forward(request,response);
//2 使用response进行重定向response.sendRedi
rect(req.getContextPath()+"/role/roleList.action");
void 的主要用途在于我们以后要学习的ajax请求,因为ajax只需要返回数据,不需要返回视图
String返回值
返回值是String,代表返回视图的名称,会配和前面在配置文件中配置的视图解析器,会加前缀和后缀,如果使用这种方式,可以使用参数中的model或者modelMap进行数据的填充(企业开发中推荐使用这种方式,因为数据模型和视图被分离,程序被解耦)
内部转发
相对于执行了request的内部转发的操作,model中的数据存在,相当于一次请求
return "forward:/role/roleList.action;"
重定向
相当于执行了重定向的操作,model中的数据没有
return "redirect:/role/roleList.action?id=" + id;
注意:此种方式的重定向是不需要添加web应用的名称,系统会自动为我们添加
返回值是String注意问题
- 如果返回值是单纯的字符串,springmvc会添加前后缀,如果是重定向或者转发不会添加前后缀
- 如果是重定向的话此处的路径不写wen应用的名称,springmvc会默认添加
- 如果我们使用response对象进行重定向,那么必须要写web应用名称,因为上一种是springmvc帮我们进行的重定向,使用response的话springmvc就不会给我们添加
- 如果是重定向的话model中的数据是不能使用的,因为model中的数据是保存在request域中
设置全局异常处理
系统中异常包括两类:预期异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发、测试通过手段减少运行时异常发生。
系统的dao、service、controller出现都通过throws Exception向上抛出,最后由springmvc前端控制器交由异常处理器进行异常处理,如下图
所以我们要想处理这些从dao、service、controller抛出的这些异常,就需要我们自己写一个类实现异常处理器接口HandlerExceptionResolver,然后将此实现类配置到springmvc的配置文件中
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object obj) throws Exception {
if(request.getServletPath().equals("/user/login.action")){
return true;
}
if(request.getSession().getAttribute("user") != null){
return true;
}
request.getRequestDispatcher("/index.jsp").forward(request, response);
return false;
}
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<mvc:exclude-mapping path=""/>
<bean class="top.xiesen.ssm.intercept.LoginIntercept"></bean>
</mvc:interceptor>
</mvc:interceptors>
1.自定义一个异常类实现 HandlerExceptionResolver ,重写 resolveException 方法
2.将异常类放到spring容器中,可以在springmvc文件中配置bean,<bean class="top.xiesen.ssm.util.CustomException"></bean>
或者直接在异常类上添加注解
@Controller
public class CustomException implements HandlerExceptionResolver{
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object obj,
Exception exception) {
ModelAndView mav = new ModelAndView();
mav.addObject("obj", obj);
mav.addObject("exception", exception);
mav.setViewName("role/error");
return mav;
}
}
Spring图像上传
1.导包 commons-io
和 commonsfileuplod
2.在jsp页面上添加上传空间 <input type="file" name="pic">
name属性名特别注意不能喝model中的名字相同,因为此处上传的路径名不是唯一的,需要我们自己修改一下路径名。注意修改form表单的属性值 <form action="<c:url value="/role/updateRole.action"/>" method="post" enctype="multipart/form-data">
。
3.编写Controller实现类
@RequestMapping(value="/role/updateRole.action",method=RequestMethod.POST)
public String EditRole(RoleVo rv,MultipartFile pic) throws Exception{
// 产生随机的名字
String str = UUID.randomUUID().toString().replaceAll("-", "");
// 获取图像的后缀名
String extension = FilenameUtils.getExtension(pic.getOriginalFilename());
// 拼接新起的图片名
String fileName = str + "." + extension;
// 设置图像上传后的路径,
String path = "D:\\Develop\\upload";
// 拼接成图片访问路径
pic.transferTo(new File(path + "\\" + fileName));
// 把文件名给对象
rv.getRole().setrPic(fileName);
// 数据库更新
rs.updateRole(rv.getRole());
// 跳转页面
return "redirect:/role/roleList.action";
}
4.在springmvc中配置上传实现类
<!-- 这个bean比较特殊,只能使用id进行标识,并且id必须是id="multipartResolver" -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 配置图片最大上传大小 -->
<property name="maxUploadSize" value="6291456"></property>
</bean>
我们也可以创建一个虚拟目录,进行文件的存放文件,这样就不会在服务器重新部署的时候将文件夹的内容给清空了
RESTful支持
Restful就是一个资源定位及资源操作的风格。不是标准也不是协议,只是一种风格
- 使用RESTful进行资源访问,requestMapping上要使用{变量名} ,参数使用注解 @PathVariable 进行获取
@RequestMapping("/{id}.action")
public ModelAndView restful(@PathVariable Integer id){
System.out.println(id);
ModelAndView mv = new ModelAndView();
mv.setViewName("success");
return mv;
}
自定义分页标签
目录结构
操作步骤
- 将tld文件夹拷贝到WEB-INF下
- 将NavigationTag和Page文件拷贝到src自定义目录
- 修改tld文件夹下的 commons.tld 文件,注意将
<tagclass>
标签改为 NavigationTag 的完整类名
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE taglib
PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
"http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
<taglib>
<tlib-version>2.0</tlib-version>
<jsp-version>1.2</jsp-version>
<short-name>common</short-name>
<!-- 名字可以随便写,相当于引入标签库中的uri -->
<uri>http://top.xiesen.com/common/</uri>
<!-- 相当于给标签库起的名字 -->
<display-name>Common Tag</display-name>
<!-- 给标签库进行的描述 -->
<description>Common Tag library</description>
<!-- 在该标签库中定义一个标签 -->
<tag>
<!-- 标签的名称 -->
<name>page</name>
<!-- 和相关的类进行关联 -->
<tag-class>top.xiesen.ssm.util.NavigationTag</tag-class>
<body-content>JSP</body-content>
<description>create navigation for paging</description>
<!-- 定义标签中的一个属性名称是bean-->
<attribute>
<name>bean</name>
<!-- 是否可以通过jsp表达式动态的进行赋值 -->
<rtexprvalue>true</rtexprvalue>
</attribute>
<!-- 定义标签中的一个属性名称是number-->
<attribute>
<name>number</name>
<!-- 是否可以通过jsp表达式动态的进行赋值 -->
<rtexprvalue>true</rtexprvalue>
</attribute>
<!-- 定义标签中的属性 -->
<attribute>
<name>url</name>
<!-- 是否是必须的 -->
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>
- 在需要引入分页标签的文件中添加标签库的引入,注意 uri 为之前定义的路径
<%@ taglib prefix="xs" uri="http://top.xiesen.com/common/" %>
- 在页面中添加分页,注意url属性不能使用c标签,并且只有域中有名称为page且值为page对象的数据的时候,分页才能正常显示,否则分页是不会渲染的
<xs:page url="${pageContext.request.contextPath }/user/userList.action"></xs:page>
- 在对应的controller中,需要向model中放入名称为page,值为page对象的数据
- page中有4个属性
- total表示总条数
- page表示当前页
- size表示每页显示多少条
- rows表示存放的数据
- NavigationTag中有3个属性
- bean表示在jsp页面中放在request域中的key的值,默认是page
- number表示分页标签中显示多少个页码(有默认值)
- url表示点击分页后请求的地址(会自动读取请求中的数据进行拼接)
- 在处理分页的时候,一定要注意表单中的数据回填,因为 NavigationTag 会将回填的数据获取到,进行url上的拼接,所以当我们查看分页标签的链接地址的时候会发现其后面会默认拼接进行回填的数据,这样 controller 就能得到请求页和请求查询的数据进行查询
- 创建分页对象的过程应该在service层进行创建
@Override
public Page loadPage(String userKeyWord, String userserarchfield, int currentPage) {
Page<User> page = new Page<>();
page.setPage(currentPage);
page.setTotal(um.findAllUserCount(userKeyWord,userserarchfield));
page.setSize(10);
page.setRows(um.findAllUser(userKeyWord, userserarchfield,(currentPage-1)*10));
return page;
}
相关推荐
Spring、SpringMVC和Mybatis是Java开发中最常用的三大开源框架,它们的整合使用,通常被称为SSM框架。这个框架组合提供了完整的后端服务解决方案,包括依赖注入(DI)、面向切面编程(AOP)、模型-视图-控制器(MVC...
SpringMVC是Spring框架的一个模块,专为构建Web应用程序提供模型-视图-控制器(MVC)架构。这个“springMVC练手代码”压缩包包含的资源可以帮助初学者或开发者深入了解并实践SpringMVC的基本操作和核心概念。 首先...
SpringMVC是一款强大的Java web开发框架,用于构建高效、可维护的Web应用程序。在这个"SpringMVC demo 完整源码实例下载"中,我们能够深入理解并学习SpringMVC的核心概念和实际应用。 首先,SpringMVC是Spring框架...
【狂神SpringMVC配套课程代码】一共8个模块,大概可以看我的博客,都是自己学配套整理的 欢迎大家作为学习SpringMVC的参考!! 下面附上狂神B站课程网址,和我的博客笔记(共8章) 狂神老师B站课程:...
SpringMVC是一个强大的Java Web开发框架,由Spring社区开发,它是Spring生态系统的重要组成部分,主要用于构建后端服务。SpringMVC以其灵活的配置、高度模块化和优秀的性能深受开发者喜爱。在这个"springmvc实战项目...
### SpringMVC基础知识详解 #### 一、SpringMVC简介 **SpringMVC**是Spring框架中的一个重要组成部分,主要用于Web应用程序的开发。它遵循MVC(Model-View-Controller)设计模式,帮助开发者构建清晰、可维护的Web...
SpringMVC 是一款基于 Java 的轻量级 Web 开发框架,它是 Spring 框架的重要组成部分,主要用于构建 MVC(Model-View-Controller)模式的 Web 应用程序。本教程将深入探讨 SpringMVC 的核心概念、配置以及实际应用。...
SpringMVC和SQLiteJDBC是两个在Java开发中常见的组件,它们分别用于构建Web应用程序和服务端数据存储。这里我们详细探讨这两个技术以及它们如何协同工作。 **SpringMVC** SpringMVC是Spring框架的一个模块,专门...
本教程将详细阐述如何使用四个关键组件——Maven、SpringMVC、MyBatis和Log4j——来搭建一个强大的Web应用框架,旨在提高开发效率并优化项目管理。 **Maven** 是一个流行的项目管理和综合工具,它通过统一的构建...
【SpringMVC】 SpringMVC是Spring框架的一部分,它是一个用于构建Web应用程序的轻量级、模型-视图-控制器(MVC)架构。SpringMVC通过将业务逻辑、控制逻辑和显示逻辑分离,提高了代码的可维护性和可测试性。在...
SpringMVC、Hibernate和Spring是Java开发中三大核心框架,它们各自负责应用程序的不同层面:SpringMVC用于处理HTTP请求和响应,Hibernate则是持久层框架,负责数据库操作,而Spring作为全能容器,提供依赖注入和面向...
SpringMVC和MyBatis是Java Web开发中的两个核心框架,它们在构建高效、模块化的应用程序方面发挥着重要作用。SpringMVC是Spring框架的一部分,主要负责处理HTTP请求和响应,而MyBatis则是一个轻量级的持久层框架,...
**SpringMVC 入门小程序详解** SpringMVC是Spring框架的一个重要模块,它是一个用于构建Web应用程序的轻量级、模型-视图-控制器(MVC)框架。本入门程序旨在帮助初学者理解并掌握SpringMVC的基本概念和工作流程,...
SpringMVC和Mybatis是Java开发中非常流行的两个框架,它们在企业级Web应用开发中起着关键作用。SpringMVC作为Spring框架的一部分,主要负责处理HTTP请求和响应,而Mybatis则是一个轻量级的持久层框架,专注于数据库...
SpringMVC 拦截器项目是一个典型的 Web 应用开发示例,它利用 SpringMVC 框架中的拦截器(Interceptor)机制来实现特定的功能,如权限控制、日志记录、性能统计等。SpringMVC 是 Spring 框架的一部分,专为构建基于 ...
《尚硅谷SpringMVC部分全套教学文档笔记》涵盖了SpringMVC框架的核心概念和技术,通过一系列章节深入浅出地讲解了SpringMVC的各个方面。以下是基于这些文档内容的详细知识点总结: 1. **SpringMVC概述与HelloWorld*...
Java基于Spring+SpringMVC+MyBatis实现的学生信息管理系统源码,SSM+Vue的学生管理系统。 Java基于Spring+SpringMVC+MyBatis实现的学生信息管理系统源码,SSM+Vue的学生管理系统。 Java基于Spring+SpringMVC+...
SpringMVC是Spring框架的一部分,专门用于构建Web应用程序的模型-视图-控制器(MVC)架构。在本文中,我们将深入探讨SpringMVC 5.0版本的关键特性、使用方法以及它如何增强Web开发的效率。 首先,SpringMVC 5.0是...
在本项目中,我们主要探讨的是如何将SpringMVC、MyBatis、PostgreSQL数据库以及Maven构建工具进行有效的整合,以实现一个高效且模块化的Web应用开发环境。以下是关于这些技术及其整合的关键知识点的详细说明: **1....