响应数据之返回值是String类型
方法执行完,需要跳转到指定的页面,最终给用户一个响应。springmvc提供了很多种响应的方式。
controller 方法返回字符串可以指定逻辑视图名,通过视图解析器解析为物理视图地址。
jsp
<a href="user/testString">testString</a>
controller
@Controller
@RequestMapping("/user")
public class UserController {
@RequestMapping("/testString")
public String testString(){
System.out.println("testString方法执行了");
return "success";
}
}
springmvc.xml
<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--表示文件解析所在的目录-->
<property name="prefix" value="/WEB-INF/pages/"></property>
<!--表示文件的后缀名-->
<property name="suffix" value=".jsp"></property>
</bean>
当我们点击超链接,方法就可以执行,返回success,它就会根据我们的视图解析器,去请求/WEB-INF/pages/目录下的jsp文件
整个环境搭建完成,方法返回字符串,根据视图解析器成功跳转到某个页面。
<h1>执行成功</h1>
<!--将数据存到model对象中,转发到页面,然后从request域中把值取出来-->
${user.username}
${user.password}
${user.age}
@RequestMapping("/testString")
public String testString(Model model){
System.out.println("testString方法执行了");
//模拟从数据库中查询出User对象,然后把对象存起来,转发到页面上
User user =new User();
user.setUsername("美美");
user.setPassword("123");
user.setAge(15);
model.addAttribute("user",user);
//model对象
return "success";
}
响应数据之返回值是void类型
返回值类型是void,不会再进行跳转。先了解一下默认的情况
<a href="user/testVoid">testVoid</a>
//返回值类型是void
@RequestMapping("/testVoid")
public void testVoid(Model model){
System.out.println("testVoid方法执行了");
}
如图,点击超链接后,发生404错误,/WEB-INF/pages/user/testVoid.jsp
默认情况下请求testVoid.jsp,没有返回值的时候,默认请求请求路径名称的jsp。这种情况下说明请求路径是一个默认值,这个时候我们就要在pages下面建立一个user和testVoid.jsp
如果不想这么做,并且返回void怎么办
对于转发地址:请求转发一次请求,不用编写项目的名称,重定向两次请求,要写项目名字。通过转发方式:
//返回值类型是void,不会再进行跳转。
/*
* * */
@RequestMapping("/testVoid")
public void testVoid(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("testVoid方法执行了");
//编写请求转发的程序
//目录必须要写完整,当你手动去调转发的方法,它不会再帮你去执行视图解析器,也就是不会帮你跳转到WEB-INF目录下去找jsp文件
request.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(request,response);
//不想让后面的代码继续执行,就需要写return
return;
}
目录必须要写完整,当你手动去调转发的方法,它不会再帮你去执行视图解析器,也就是不会帮你跳转到WEB-INF目录下去找jsp文件
通过重定向方式:
response.sendRedirect(request.getContextPath()+"/WEB-INF/pages/success.jsp");
此时报404错误
不能这样写,重定向相当于重新发了一个请求,直接发请求不能请求web-inf配置里面的页面,转发没问题,想跳页面
response.sendRedirect(request.getContextPath()+"xxx.jsp");
地址会发生变化,最终显示index.jsp这个目录
直接进行响应。(之前都是跳到某个jsp,然后由Tomcat服务器帮我们跳转到html,最终响应给用户)。现在都是直接发请求,然后控制器直接通过输出流,来把数据直接响应给浏览器
@RequestMapping("/testVoid")
public void testVoid(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("testVoid方法执行了");
//编写请求转发的程序
// response.sendRedirect(request.getContextPath()+"/index.jsp");
//设置中文乱码
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
//直接会进行响应
response.getWriter().print("你好");
return;
}
响应之返回值是ModelAndView类型
ModelAndView 是 SpringMVC 为我们提供的一个对象,该对象也可以用作控制器方法的返回值
可以用来调整具体的SP视图
它也可以通过视图解析器帮你跳转到某某页面。
modelandview,可以理解为它既包含model的功能,又包含view的功能,model可以存储Javabean对象,view可以存储你想往哪个页面跳转,就跟第一个代码做的功能类似。
//返回值类型是ModelAndView
@RequestMapping("/testModelAndView")
public ModelAndView testModelAndView(){
//创建modelandview
ModelAndView mv=new ModelAndView();
System.out.println("testModelAndView方法执行了...");
User user =new User();
user.setUsername("美美");
user.setPassword("123");
user.setAge(15);
//把user对象存储到mv对象中。底层也会把user对象存入到request对象中
mv.addObject("user",user);
//跳转到哪个页面,跳转到的目录是视图解析器所指定的
mv.setViewName("success");
return mv;
}
<br/>
<a href="user/testModelAndView">testModelAndView</a>