springMVC第二章

一、URL 映射

可以同时设置多个URL来访问某个控制器或方法。设置value属性:

@RequestMapping(value= {"/grade","/g"}) 表示访问这个控制器有2个URL。

URL 组成的方式由:字面量,分隔符,占位符,通配符 组成。

/user/update/{id} :user,update叫字面量,它要与访问的URL的字面量完全匹配。

访问的URL: user/update/12 这个可以访问,users/update/10 这个是不能访问到。

/ 叫分隔符 {id} 叫占位符,设置时占一个位置,访问时有数据来填充。在控制器端可以获取到请求填充的数据:

//删 id叫占位符,请求时有数据填充

@RequestMapping("delete/{id}")

public ModelAndView delete(@PathVariable(value="id") int id){

System.out.println("删除的学生编号为:"+id);  //10001

return new ModelAndView("studentList");

}

URL : student/delete/10001

URL通配符映射

通配符有“?”和“*”两个字符。其中“?”表示1个任意字符,“*”表示匹配多个任意字符,“**”表示匹配0个或多个路径。

“/helloworld/index?”可以匹配“/helloworld/indexA”、“/helloworld/indexB”,

但不能匹配 :“/helloworld/index”与“/helloworld/indexAA”。

“/helloworld/index*” 匹配“/helloworld/index”、“/helloworld/indexA”、“/helloworld/indexAA”

不能匹配:“/helloworld/index/A”;

“/helloworld/index/*”匹配“/helloworld/index/”、“/helloworld/index/A”、

“/helloworld/index/AA”、“/helloworld/index/AB”

不能匹配:/helloworld/index”、“/helloworld/index/A/B”;

“/helloworld/index/**”可以匹配“/helloworld/index/”下的多有子路径, 如:“/helloworld/index/A/B/C/D”;“/helloworld/index”和“/helloworld/*”,

如果请求地址为“/helloworld/index”那么将如何匹配?Spring MVC会按照最长匹配优先原则(即和映射配置中哪个匹配的最多)来匹配,所以会匹配“/helloworld/index”。

URL正则表达式映射

@RequestMapping(value="/reg/{name:\\w+}-{age:\\d+}")

public ModelAndView regUrlTest(@PathVariable(value="name")

String name, @PathVariable(value="age") Integer age){}

约束了name:是字符型,age是int型,请求的URL:reg/张三/20则匹配,reg/李四/xyz,则不会匹配。

限制action所接受的请求方式(get或post)

@RequestMapping(value="/paramstest", params="example",

method = {RequestMethod.GET})'

RequestMethod.GET属性表示此Action只支持get请求,如果要支持post请求,则RequestMethod取值POST。此属性没有,则支持所有请求。

二、视图与控制器之间数据传递

(一)控制器传数据到页面。

在SpringMVC的控制器方法中,返回数据的方式有多种:

ModelAndView,Model,ModelMap,Map,View,String,Void

ModelAndView是我们常用的一种,可以返回视图及数据模型。它有多个方法的重载。

常用的方法是:

public ModelAndView(String viewName, String modelName, Object modelObject),

//如果需要数据库中的数据,则调用底层方法取数据,

List<Grade> list = new ArrayList<Grade>();

list.add(new Grade());

list.add(new Grade());

list.add(new Grade());

list.add(new Grade());

//返回的是视图的名称及一种类型数据

return new ModelAndView("gradeList","grades",list);

此方法只适合返回一种类型的数据。如果有多种类型数据,则用:

public ModelAndView(String viewName, Map<String, ?> model)解决:

//如果需要数据库中的数据,则调用底层方法取数据,

List<Grade> list = new ArrayList<Grade>();

list.add(new Grade());

list.add(new Grade());

list.add(new Grade());

list.add(new Grade());

List<Student> students = new ArrayList<>();

students.add(new Student());

students.add(new Student());

students.add(new Student());

students.add(new Student());

//把多种类型数据再封装,

Map<String, Object> map = new HashMap<String, Object>();

map.put("grades", list);

map.put("students", students);

//返回的是视图的名称及数据

return new ModelAndView("gradeList",map);

public ModelAndView(String viewName) 只是返回视图名称.

还可以用Model:这就是一个已经封装好的Map对象,直接可以用。

@RequestMapping("list") //设置访问到此方法的URL

public ModelAndView list(Model model) {

//如果需要数据库中的数据,则调用底层方法取数据,

List<Grade> list = new ArrayList<Grade>();

list.add(new Grade());

list.add(new Grade());

list.add(new Grade());

list.add(new Grade());

List<Student> students = new ArrayList<>();

students.add(new Student());

students.add(new Student());

students.add(new Student());

students.add(new Student());

//自动回传到视图中,直接在视图中就可以获取到

model.addAttribute("grades",list);

model.addAttribute("students",students);

//返回的是视图的名称

return new ModelAndView("gradeList");

}

 

Map返回值

public Map<String, String> getMap() {

Map<String, String> map = new HashMap<String, String>();

map.put("key1", "value-1");

map.put("key2", "value-2");

return map;

} 在jsp页面中可直通过${key1}获得到值, map.put()相当于request.setAttribute方法。

返回的视图名与访问的URL一致..

String

Model是一个模型对象,主要包含spring封装好的model和modelMap,以及Java.util.Map,当没有视图返回的时候视图名称将由requestToViewNameTranslator决定;Model 是一个接口, 其实现类为ExtendedModelMap,继承了ModelMap类。通常结合String返回类型使用:

@RequestMapping(method = RequestMethod.GET)

public String index(Model model) {

List<User> users = userService.getUsers();

model.addAttribute("users", users);

return "user/index";

}

Void :

  方法没有返回值,返回的视图名与访问的URL一致

(二)页面传数据到控制器。

数据从视图中传递到控制器,也有多种方式:

URL上占位符传递数据,取占位符的数据。

@RequestMapping("delete/{id}")

public ModelAndView delete(@PathVariable(value="id") int id){

System.out.println("删除的学生编号为:"+id);  //10001

return new ModelAndView("studentList");

}

URL : student/delete/10001

URL上参数传递数据,取参数的数据。

URL:grade/delete?id=10

@RequestMapping("delete")    //id参数就自动获取到URL上参数的数据

public ModelAndView delete(int id) {

System.out.println(id);

return new ModelAndView("gradeList");

}

表单提交传递数据。取表单中的数据的可以在方法上添加参数,参数名与表单元素的name属性值一致就可以了。

@RequestMapping("save")

public ModelAndView save(String gradeName) {

System.out.println(gradeName);

return new ModelAndView("gradeList");

}

但是,如果表单元素比较多的情况下,则方法中的参数也会有很多,麻烦。我们还可以直接把表单中的数据封装成实体对象获取。

@RequestMapping("save")  //把表单中的数据封装成实体对象,要求表单元素的name属性值与实体对象的属性名一致。

public ModelAndView save(Grade grade) {

System.out.println(grade.getGradeName());

return new ModelAndView("gradeList");

}

三、中文乱码问题的解决:

以前的解决方案是自己写一个过滤器,对所有的请求进行过滤。用SpringMVC框架时,他已经考虑到这个问题,所以在SpringMVC框架中已经封装好了这个过滤器,就需要我们再创建过滤器类,直接用SpringMVC框架提供的过滤器就可以了。

<!-- SpringMVC 解决中文乱码的问题, -->

<filter>

<filter-name>characterFilter</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>characterFilter</filter-name>

<!--  /*  过滤到所有的请求  -->

<url-pattern>/*</url-pattern>

</filter-mapping>

四、在控制器的方法中访问另一个方法或另一个控制器的方法

采用redirect或forward这两种方式。

@RequestMapping("save") // 把表单中的数据封装成实体对象,要求表单元素的name属性值与实体对象的属性名一致。

public ModelAndView save(Grade grade) {

int result = gradeService.addGrade(grade);

if (result > 0) { // 添加成功

//redirect:list 去执行list这个URL,如果没有redirect或forward,则认为list是视图

return new ModelAndView("redirect:list"); //list是视图名称

}

return new ModelAndView("gradeAdd");

}

五、静态资源访问

静态资源访问时,也是向服务端发请求,DispatcherServlet 前端控制器拦截到请求后,且后端是没有做此URL映射的,所以,静态资源的访问被拦截后,报404。

三月 01, 2019 10:23:37 上午 org.springframework.web.servlet.DispatcherServlet noHandlerFound

警告: No mapping found for HTTP request with URI [/springMVCDemo/images/2.jpg] in DispatcherServlet with name 'springMVC'

浏览器上的报错信息如下:

解决方案是,让DispatcherServlet 前端控制器不拦截静态资源的请求。在springMVC 的主配置文件下进行配置:

<!-- 静态资源处理 -->

<mvc:resources location="/images/" mapping="/images/**"/>

<mvc:resources location="/css/" mapping="/css/**"/>

<mvc:resources location="/js/" mapping="/js/**"/>

<!-- 也可以如下处理,静态资源的处理交给容器的Servlet来处理 -->

<mvc:default-servlet-handler/>

springMVC第二章的更多相关文章

  1. Spring 3.x 实践 第一个例子(Spring 3.x 企业应用开发实战读书笔记第二章)

    前言:工作之后一直在搞android,现在需要更多和后台的人员交涉,技术栈不一样,难免鸡同鸭讲,所以稍稍学习下. 这个例子取自于<Spring 3.x 企业应用开发实战>一书中的第二章,I ...

  2. ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之第二章:利用模型类创建视图、控制器和数据库

    在这一章中,我们将直接进入项目,并且为产品和分类添加一些基本的模型类.我们将在Entity Framework的代码优先模式下,利用这些模型类创建一个数据库.我们还将学习如何在代码中创建数据库上下文类 ...

  3. 《Django By Example》第二章 中文 翻译 (个人学习,渣翻)

    书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:翻译完第一章后,发现翻译第二章的速 ...

  4. Jenkins入门系列之——02第二章 Jenkins安装与配置

    2014-12-08:已不再担任SCM和CI的职位,Jenkins的文章如无必要不会再维护. 写的我想吐血,累死了. 网页看着不爽的,自己去下载PDF.有问题请留言! Jenkins入门系列之——03 ...

  5. Python黑帽编程 2.0 第二章概述

    Python黑帽编程 2.0 第二章概述 于 20世纪80年代末,Guido van Rossum发明了Python,初衷据说是为了打发圣诞节的无趣,1991年首次发布,是ABC语言的继承,同时也是一 ...

  6. 《Entity Framework 6 Recipes》翻译系列 (3) -----第二章 实体数据建模基础之创建一个简单的模型

    第二章 实体数据建模基础 很有可能,你才开始探索实体框架,你可能会问“我们怎么开始?”,如果你真是这样的话,那么本章就是一个很好的开始.如果不是,你已经建模,并在实体分裂和继承方面感觉良好,那么你可以 ...

  7. Asp.Net MVC4 + Oracle + EasyUI 学习 第二章

    Asp.Net MVC4 + Oracle + EasyUI 第二章 --使用Ajax提升网站性能 本文链接:http://www.cnblogs.com/likeli/p/4236723.html ...

  8. 数据结构与算法分析C++表述第二章编程题

    把昨天看的第二章巩固一下,做一做编程习题. 2.6: 第一天交2元罚金,以后每一天都是前一天的平方,第N天罚金将是多少? 这个题目和2.4.4-3介绍的幂运算基本一致.若按相同的递归思路分析,比那个问 ...

  9. 【vue.js权威指南】读书笔记(第二章)

    [第2章:数据绑定] 何为数据绑定?答曰:数据绑定就是将数据和视图相关联,当数据发生变化的时候,可以自动的来更新视图. 数据绑定的语法主要分为以下几个部分: 文本插值:文本插值可以说是最基本的形式了. ...

随机推荐

  1. oracle静默安装

    RHEL6+oracle11.2 无界面化命令安装如下: 1.所需安装软件包检查: yum install binutils-2.* compat-libcap1* compat-libstdc++- ...

  2. Oracle子查询之高级子查询

    Oracle 高级子查询 高级子查询相对于简单子查询来说,返回的数据行不再是一列,而是多列数据. 1,多列子查询 主查询与子查询返回的多个列进行比较 查询与141号或174号员工的manager_id ...

  3. 谨慎修改Oracle数据库字符集(UTF8<->ZHS16GBK)

      Preface       Today,I'm gonna say something what is related with the character set in Oracle datab ...

  4. 记一次简单的UITableView卡顿优化

    先说需求,要做一个类似这种的列表 标签控件直接用的第三方 YZTagList 不知道的可以去搜一下,当这不重要. 重要的是这个控件加载数据的时候非常影响列表滑动效果,造成卡顿,尤其是列表行数如果更多的 ...

  5. es6 数组扩展方法

    1.扩展运算符 含义: 扩展运算符,三个点(...),将一个数组转为用逗号分隔的参数顺序. 例如: console.log([1,2,3]); console.log(...[1,2,3]);   结 ...

  6. 原生js实现简单的随机点名系统

    <!DOCTYPE html> <html lang="en"> <head>     <meta charset="UTF-8 ...

  7. 判断ARP欺骗

    转自http://bbs.51cto.com/thread-904594-1.html 网关是服务器或者单独主机设备的话 如果网关是服务器或者单独主机设备的话查询网关MAC地址要简单一些,我们只需要在 ...

  8. html中的定位

    html中的定位体系 一. 分类 1.常规流static 2.浮动float 3.相对定位relative 4.绝对定位absolute 5.固定定位fixed 二.使用时的区分 在网页布局中,常常都 ...

  9. Kafka 学习翻译 - 介绍

    Kafka是一个分布式的流式平台.可以从几个方面理解: 1. 三个重要的能力: 能够实现流式的发布和订阅数据,类似于消息队列或者企业级的消息分发系统. 能够在提供一定容错性和持久性能力的基础上存储数据 ...

  10. php http_build_query stream_context_create post请求

    <?php function send_post($url, $post_data) { $postdata = http_build_query($post_data); $options = ...