路径变量PathVariable  

    PathVariable

      Controller除了可以接收表单提交的数据之外,还可以获取url中携带的变量,即路径变量,此时需要使用@PathVariable注解来设置,其中包含下面几个属性。

    • value:指定请求参数的名称,即url中的值,当url中的名称和方法参数名称不一致时,可以使用该属性解决。
    • name:同value,两者只能使用一个
    • required:指定该参数是否是必须传入的,boolean类型。若为 true,则表示请求中所携带的参数中必须包含当前参数。若为 false,则表示有没有均可。

     创建Controller,注意@RequestMapping注解中的写法

package controller;

import bean.Student;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView; @Controller
public class RegistController03 { @RequestMapping("/{username}/{age}/regist.do")
public ModelAndView regist(@PathVariable("username") String name,@PathVariable int age) throws Exception{ ModelAndView mv = new ModelAndView();
mv.addObject("name", name);
mv.addObject("age", age);
mv.setViewName("result");
return mv;
}
}

    之后,在浏览器的地址栏里面直接输入: 

localhost:/jack//regist.do  

    此时可以直接获取url中的jack和19的值。

    这种方式在restful风格的url中使用较多。 

  Controller中方法的返回值(上)  

    Controller中方法的返回值类型

    在我们之前写的Controller的方法中,返回值都写的是ModelAndView,其实还可以返回其他类型的对象,在实际应用中需要根据不同的情况来使用不同的返回值:

    • ModelAndView
    • String
    • void
    • 自定义类型 

     返回ModelAndView(跳转页面以及传递参数)

    先来看下ModelAndView,这个是我们之前一直使用的返回值,如果Controller的方法执行完毕后,需要跳转到jsp或其他资源,且又要传递数据, 此时方法返回ModelAndView比较方便。
如果只传递数据,或者只跳转jsp或其他资源的话,使用ModelAndView就显得有些多余了   

     返回String类型(跳转页面)

    如果controller中的方法在执行完毕后,需要跳转到jsp或者其他资源上,此时就可以让该方法返回String类型,返回String类型多用于只跳转页面而不传递参数的情况下(restful风格也使用String类型)。

    String类型返回内部资源

    1、创建一个Controller,方法返回String类型:   

package controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView; /**
* 方法返回String类型
*/
@Controller
public class ReturnStringController01 { @RequestMapping("/welcome.do")
public String welcome() throws Exception{
//直接填写要跳转的jsp的名称
return "welcome";
}
}

    springmvc.xml中设置的视图解析器为jsp,所以这里跳转的全路径为/jsp/welcome.jsp

    2、编写welcome.jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body> 欢迎你学习java!
</body>
</html>

    3、在浏览器的地址栏中输入:   

localhost:/welcome.do

    String类型返回外部资源

    如果你需要在controller的方法中跳转到外部资源,比如跳转到www.baidu.com:

    此时需要在springmvc.xml文件中配置一个BeanNameViewResolver类,这个类被称作是视图解析器。在springmvc.xml文件中添加下面内容:   

<!-- 视图解析器 -->
<bean class="org.springframework.web.servlet.view.BeanNameViewResolver"/>
<!--定义外部资源view对象-->
<bean id="returnString" class="org.springframework.web.servlet.view.RedirectView">
<property name="url" value="http://www.baidu.com/"/>
</bean>
  

    其中id是controller中的方法返回值,value是要跳转的外部资源的地址。

    之后修改controller中的方法返回值:   

@RequestMapping("/welcome.do")
public String welcome() throws Exception{ //直接填写要跳转的jsp的名称
return "returnString";
}

    此时在浏览器中输入:    

localhost:/welcome.do

    然后页面就会跳转到你指定的外部资源了。  

     Model对象

    之前简单说过这个Model,它是一个接口,写在controller的方法中的时候,spring mvc会为其进行赋值。我们可以使用Model对象来传递数据,也就是说我们可以使用Model传递数据并且将方法返回值设置为String类型,通过这种方式实现与方法返回ModelAndView一样的功能。

@RequestMapping("/welcome1.do")
public String welcome1(String name,Model model) throws Exception{ //这种写法spring mvc会自动为传入的参数取名
//model.addAttribute(name);
model.addAttribute("username", name);
//直接填写要跳转的jsp的名称
return "welcome";
}

    在welcome.jsp中添加下面内容:   

${username}<br>
${string}<br>

    从浏览器的url中输入:

http://localhost:8080/welcome1.do?name=jack    

    可以看到页面中会显示两个jack

    上面controller中使用了下面的写法:   

model.addAttribute(name);

    这种写法spring mvc会根据传入的参数对其进行取名,此时传入的参数name是一个String类型,因此会给他取名为string,即类似如下写法:

model.addAttribute("string", name);

    这里面spring mvc的取名方式就是根据传入参数的类型来取名的,例如:   

传入Product类型,会将其命名为"product"
  MyProduct 命名为 "myProduct"
  UKProduct 命名为 "UKProduct"

另外在Model接口中还有两个方法:

    • addAllAttributes(Collection<?> attributeValues);
      会将传入的list中的数据对其进行命名,例如:
List<Integer> integerList = new ArrayList<>();
integerList.add();
integerList.add();
integerList.add();
model.addAllAttributes(integerList);

    上面代码相当于:   

model.addAttribute("", );
model.addAttribute("", );
model.addAttribute("", );
    • addAllAttributes(Map<string, ?=""> attributes);

    会将map中的key作为名字,value作为值放入到model对象中,例如:   

Map<String, Integer> integerMap = new HashMap<>();
integerMap.put("first", );
integerMap.put("second", );
integerMap.put("third", );
model.addAllAttributes(integerMap);

    上面代码相当于:    

model.addAttribute("first", );
model.addAttribute("second", );
model.addAttribute("third", );

   Controller中方法的返回值(下)  

     返回void

    如果你不用spring mvc帮你完成资源的跳转,此时可以将controller中的方法返回值设置为void。一般情况下有下面两个应用场景:

    • 通过原始的servlet来实现跳转
    • ajax响应

    先来看第一个,使用servlet来实现跳转,spring mvc底层就是servlet,因此我们可以在controller中使用servlet中的方法来实现页面的跳转,参数的传递。\    

package controller;

import bean.Student;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping; import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException; @Controller
public class controllerTest {
@RequestMapping("/welcome2.do")
public void welcome2(HttpServletRequest request, HttpServletResponse response, Student student) throws ServletException, IOException {
request.setAttribute("student", student);
//因为使用servlet中的api,所以视图解析就不能使用了
request.getRequestDispatcher("/jsp/welcome.jsp").forward(request,response);
}
}

    上面的写法跟之前在servlet中是一样的。

    再来看下ajax响应,这块来使用下jQuery,先下载jQuery:

http://jquery.com/download/

    拷贝到项目中webapp/js目录中,然后编写ajaxRequest.jsp    

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head>
<title>Title</title>
<script src="/js/jquery-3.3.1.js"></script>
</head>
<body>
<button id="ajaxRequest">提交</button>
</body>
<script>
$(function () {
$("#ajaxRequest").click(function () {
$.ajax({
method:"post",
url:"/ajaxRequest.do",
data:{name:"monkey",age:18},
dataType:"json",
success:function (result) {
alert(result.name + "," + result.age);
}
});
});
}); </script>
</html>

    创建Controller,这里使用了fastjson,所以需要将fastjson的jar包导入到项目中:

<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.46</version>
</dependency>

在Controller中添加下面方法

@RequestMapping("/ajaxRequest.do")
public void ajaxRequest(HttpServletRequest request, HttpServletResponse response, Student student) throws Exception{ PrintWriter out = response.getWriter();
String jsonString = JSON.toJSONString(student); out.write(jsonString);
}

    返回Object类型 

    倘若需要controller中的方法返回Object类型,需要先配置下面内容:

    1、添加jackson的jar包,在Spring mvc中使用了jackson来进行json数据格式的转换。

  <dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.4</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.4</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.4</version>
</dependency>

    2、在springmvc.xml文件中添加注解驱动。 

<mvc:annotation-driven/>

    上面两个配置缺一不可。

    Object类型返回String字符串
    3、之前在controller方法中返回字符串,spring mvc会根据那个字符串跳转到相应的jsp中。这里返回的字符串会添加到响应体中传递到jsp页面中,此时需要在方法上添加一个注解@ResponseBody即可。运行程序可能会出现乱码,所以在RequestMapping中使用@produces注解

package controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody; /**
* 方法返回Object类型
*/
@Controller
public class ReturnObjectController01 {
@RequestMapping(value = "/returnObject.do", produces = "text/html;charset=utf-8")
@ResponseBody
public Object welcome4(){
return "This is Object!";
  }
}

    4、在jsp中发送ajax请求:    

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
<script src="/js/jquery-3.3.1.js"></script>
</head>
<body>
<button id="ajaxRequest">提交</button>
</body>
<script>
$(function () {
$("#ajaxRequest").click(function () {
$.ajax({
method:"post",
url:"/returnObject.do",
success:function (result) {
alert(result);
}
});
});
});
</script>
</html>

    Object返回map类型

    创建controller:   

@Controller
public class ReturnObjectController01 { @RequestMapping(value = "/returnString.do")
@ResponseBody
public Object returnString() throws Exception{ Map<String, String> map = new HashMap<>();
map.put("hello", "你好");
map.put("world", "世界");
return map;
}
}

    jsp中添加ajax:

$(function () {
$("#ajaxRequest").click(function () {
$.ajax({
method:"post",
url:"/returnString.do",
success:function (result) {
alert(result.hello);
}
});
});
});

    除了这些之外还可以返回其他类型:List,基本数据类型的包装类,自定义类型等,这里就不演示了。

 

Spring全家桶之springMVC(四)的更多相关文章

  1. Spring全家桶之springMVC(一)

    Spring MVC简介和第一个spring MVC程序 Spring MVC是目前企业中使用较多的一个MVC框架,被很多业内人士认为是一个教科书级别的MVC表现层框架,Spring MVC是大名鼎鼎 ...

  2. Spring全家桶之SpringMVC(三)

    Spring MVC单个接收表单提交的数据   单个接收表单提交的参数 在实际开发中通过会在spring MVC的Controller里面接收表单提交过来的参数,这块代码该怎么去编写呢? 示例: 编写 ...

  3. Spring全家桶之springMVC(二)

    spring mvc中url-pattern的写法 1.设置url-pattern为*.do 之前我们在web.xml文件中配置DispatcherServlet的时候,将url-pattern配置为 ...

  4. 10分钟详解Spring全家桶7大知识点

    Spring框架自2002年诞生以来一直备受开发者青睐,它包括SpringMVC.SpringBoot.Spring Cloud.Spring Cloud Dataflow等解决方案.有人亲切的称之为 ...

  5. 一文解读Spring全家桶 (转)

    Spring框架自2002年诞生以来一直备受开发者青睐,它包括SpringMVC.SpringBoot.Spring Cloud.Spring Cloud Dataflow等解决方案.有人亲切的称之为 ...

  6. 【转】Spring全家桶

    Spring框架自诞生以来一直备受开发者青睐,有人亲切的称之为:Spring 全家桶.它包括SpringMVC.SpringBoot.Spring Cloud.Spring Cloud Dataflo ...

  7. Spring全家桶–SpringBoot Rest API

    Spring Boot通过提供开箱即用的默认依赖或者转换来补充Spring REST支持.在Spring Boot中编写RESTful服务与SpringMVC没有什么不同.总而言之,基于Spring ...

  8. Java秋招面试复习大纲(二):Spring全家桶+MyBatis+MongDB+微服务

    前言 对于那些想面试高级 Java 岗位的同学来说,除了算法属于比较「天方夜谭」的题目外,剩下针对实际工作的题目就属于真正的本事了,热门技术的细节和难点成为了面试时主要考察的内容. 这里说「天方夜谭」 ...

  9. Spring全家桶系列–SpringBoot之AOP详解

    //本文作者:cuifuan //本文将收录到菜单栏:<Spring全家桶>专栏中 面向方面编程(AOP)通过提供另一种思考程序结构的方式来补充面向对象编程(OOP). OOP中模块化的关 ...

随机推荐

  1. 详细的JavaScript知识梳理和经典的一百个例题,让你掌握JavaScript

    这里先做一下JavaScript知识点的梳理,具体的可领取资料 JavaScript语法: js语法.png DOM操作: DOM操作.png 数据类型 面向对象 继承 闭包 插件 作用域 跨域 原型 ...

  2. Unity 芯片拼图算法

    很多游戏的养成系统中会有利用芯片或者碎片来合成特定道具的功能,或者来给玩家以额外的属性提升等,先截个图以便更好说明: 如上图,我们有各种各样形状迥异的碎片,上面只不过列举了其中一部分,现在,我们需要利 ...

  3. css3变形

    CSS3变形--旋转 rotate() 旋转rotate()函数通过指定的角度参数使元素相对原点进行旋转.它主要在二维空间内进行操作,设置一个角度值,用来指定旋转的幅度.如果这个值为正值,元素相对原点 ...

  4. PHP中级篇 Apache配置httpd-vhosts虚拟主机总结及注意事项

    经常使用Apache虚拟主机进行开发和测试,但每次需要配置虚拟主机时都习惯性的ctrl+c和ctrl+v,这次由于重装系统,需要配置一个新的PHP开发环境虚拟主机,于是总结一下Apaceh配置http ...

  5. Linux安全实验缓冲区溢出

    缓冲区溢出实验: 缓冲区溢出是指程序试图向缓冲区写入超出预分配固定长度数据的情况.这一漏洞可以被恶意用户利用来改变程序的流控制,甚至执行代码的任意片段.这一漏洞的出现是由于数据缓冲器和返回地址的暂时关 ...

  6. List of common SCSI KCQs

    Category Key ASC ASCQ Error Condition No Sense 0 00 00 No error 0 5D 00 No sense - PFA threshold rea ...

  7. Pycharm中设置encoding

    在Pycharm专业版中,为了防止文件在别的机器上出现乱码,所以需要进行字符编码的设置. 首先在Pycharm中的View中将下图中的Toolbar打上勾. 接着,工具栏就会出现,选中settings ...

  8. 面试题总结-Java部分

    1 集合 1.1 hashmap原理 HashMap是基于哈希表实现的,每一个元素是一个key-value对,实现了Serializable.Cloneable接口,允许使用null值和null键.不 ...

  9. flex学习

            今天看视频学习的时候,发现css有一个 flex 的属性,非常的好用,为了让自己能够熟记,特意来分享一下flex的用法. 首先,采用Flex布局的元素,称为Flex容器(flex co ...

  10. JS的String()、toString()、valueOf()的一些隐秘特性

    toString()方法 要把一个值转换为一个字符串,最常用的就是,使用几乎每个值都有的toString()方法,这个方法唯一要做的就是返回相应值的字符串表现. 数值.布尔值.对象和字符串值(没错,每 ...