一、返回String类型参数
index.jsp中:
<a href="response/testString">testString</a>
responseController中:
@Controller
@RequestMapping("/response")
public class responseController {
/**
* 有返回String类型给前台接收
*/
@RequestMapping("/testString")
public String testString(Model model){
System.out.println("testString方法执行了...");
User uuuuu = new User();
uuuuu.setAge(16);
uuuuu.setUsername("姓名");
model.addAttribute(uuuuu);
model.addAttribute("字符串");
model.addAttribute(9547);
model.addAttribute("串串");
model.addAttribute(1234);
return "success";
}
}
success.jsp:
将request域中打印出来
我们一般是通过model.addAttribute(key,obj);
这个形式,来向request域中存入一个键值对,这个我们都很容易操作,只要在request域中用对应的key将obj取出来即可。
发现它还有一个model.addAttribute(obj);
的方法,于是我想到,如果不指定key,那么这个对象存进去了,该怎么取出来呢。
这段代码中,我们通过model对象向request域中存了一个User类对象,两个字符串,两个整数。
启动服务器实验后发现,我们可以在request域中发现这几个刚存进去的东西:
可以通过结果发现,默认的key均为该对象所属的类的首字母小写!,那么“字符串”和9547这两个去哪了呢?这是由于他们的key是默认相同了,所以后存入的那个把前面那个给覆盖掉了。
由此我们知道,在前台页面可以通过相应的key=string,key=integer来拿到存入的字符串和数字。当然这个只是一个实验,并不建议这么用,正常还是老老实实用key,value形式存,避免出错
二、使用转发和重定向
WEB-INF下面的内容都是只能由服务器级别才能访问,客户端并不能访问。什么是客户端级别?什么是服务器级别呢?
转发:
服务器级别,浏览器的地址不会变,因为,客户端发送一个请求,服务器受理之后,发现要请求内容还要再去别的请求,那么转发就是服务器自己去处理完成。不麻烦客户端(浏览器)了,所以客户端上面的地址栏不会改变。
重定向:
就是客户端级别的。服务器收到请求后,发现还要去请求别的内容,但是服务器自己不想处理,那么就告诉客户端,你自己去处理吧,那么客户端就去请求那个别的内容了。所以客户端(浏览器)地址栏就会改变了。
转发和重定向有两种方式:
1、原生servlet:
注释内为转发和重定向的两句,注意重定向这里要使用request.getContextPath()来获取项目路径,后面再接webapp目录下的response.jsp页面
@RequestMapping("/testVoid")
public void testVoid(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("testVoid方法执行了...");
//request.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(request,response);
//response.sendRedirect(request.getContextPath()+"/response.jsp");
}
2、springMVC方式:
这里为什么可以省去request.getContextPath()呢,因为这是springmvc框架为我们自动处理了,可以直接写webapp目录下所需要访问的页面即可。
注意这里的语法,前面的forward:和redirect:是固定写法。
@RequestMapping("/testDispatcherAndRedirect")
public String testDispatcherAndRedirect(){
System.out.println("testVoid方法执行了...");
//使用转发
//return "forward:/WEB-INF/pages/success.jsp";
//使用重定向
return "redirect:/response.jsp";
}
可以看到springmvc给我们提供的这个方法比使用原生servlet的API好用。
三、返回ModelAndView类型
controller:
@RequestMapping("testModelAndView")
public ModelAndView testModelAndView(){
System.out.println("testModelAndView方法执行了...");
ModelAndView mv = new ModelAndView();
mv.addObject("username","哈哈哈");
mv.setViewName("success");
return mv;
}
success.jsp页面代码和运行结果
说明使用ModelAndView,可以分为两部分,一个是Model类的作用,一个是View(指定页面)的作用,Model的作用就不再赘述,其中View就指的是之前我们通过return “success”;
来调用视图解析器
来帮我们跳转是一样的,但是这里只写了一个success,能够成功跳转,说明也使用到了视图解析器,我们现在将视图解析器去掉,只写一个mv.setViewName("success");
,无疑是不行的。因此在没有视图解析器的情况下,我们应当指定的是mv.setViewName("/WEB-INF/pages/success.jsp");
这个完整的路径。
三、相应json数据
1、配置取消拦截静态资源
我们用jquery等的静态资源,由于我们之前在配置前端控制器DispatcherServlet的时候,将每一个请求都拦截,导致这个静态资源的请求也被拦截,所以我们要配置,告诉springmvc,这个资源不要去拦截。
2、编写前端发送ajax请求
在index.jsp中引入js文件
<script src="js/jquery-3.0.0.min.js"></script>
<script>
$(function () {
$("#btn").click(function () {
$.ajax({
url:"response/testAjax",
contentType:"application/json;charset=UTF-8",
dataType:"json",
data:'{"username":"哈哈哈","age":18}',
type:"post",
success:function (data) {
alert(JSON.stringify(data));
alert(data.username);
alert(data.age);
}
});
});
});
</script>
<button id="btn" value="点击">按钮</button>
url:请求的controller地址
contentType:设置类型和字符编码
dataType:发送的数据类型
data:和dataType对应的该类型的数据,此处为json字符串
type:请求方式,此处为post方式
success:发送成功后做出的动作,此处用形参data来接收返回的数据,并转成json字符串,并通过弹窗来弹出该字符串和username以及age。
其中,alert(JSON.stringify(data));
可以帮我们将Json对象转换为字符串。否则直接用data打印的话,只能打印出Object object。
controller里的方法:
@RequestMapping("/testAjax")
public @ResponseBody User testAjax(@RequestBody User user){
System.out.println("testAjax方法执行了");
user.setUsername("嘻嘻嘻");
return user;
}
此处通过@RequestBody
来接收ajax返回的Json字符串并将串中的各个键值对,springmvc帮我们将这些键值对封装到user对象中,并在返回类型User前加上@ResponseBody
来将返回的User类型的对象转换成Json字符串。
这个操作,需要一组jar包来支持,由于是maven项目,只需要导入依赖的坐标即可
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.0</version>
</dependency>
运行结果: