问题引出:
基于目前项目多为前后端分离的趋势下(有关原因可参看 以下三个网址
1.前后端分离情况下如何在 html 中进行值/参数的传递?
2.为什么一定要前后端分离?
3.前后端分离架构概述
),
许多教程使用springmvc的Controller类的时候 多是基于jsp的,即都是使用modelAndView 对象将数据封装到modelAndView 中 在直接跳转到 ”xxx.jsp"中
这样的做法 虽能在前端显示数据出来 但是耦合度太高 (在后端控制页面跳转了)
我们说在web项目中,若使用springmvc,则controller的返回值一般有两种,一种是返回对应的页面(例如html页面,jsp页面),一种是返回数据(例如json格式的数据)。
1.使用@Controller注解,返回对应的页面(不推荐)
如下代码:
@Controller
public class UserController {
@Resource
private IUserService userService;
@RequestMapping("/userLogin")
public String userLogin(@Param("userName") String userName){
model.addAttribute("msg", "this is a msg");
return "success";//返回对应的名为success的页面 因为在 springmvc-servlet.xml配置过前缀后缀 了
}
}
在 springmvc-servlet.xml 配置 jsp 的前缀后缀
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
方案2. 在方法上加上@ResponseBody注解,返回json格式的数据 (直接返回数据 由前端控制这些数据 然后利用js等渲染成页面 再由前端控制跳转等操作 推荐!!)。
代码如下:
public class UserController {
@Resource
private IUserService userService;
@RequestMapping(value="/findAll",produces="application/json;charset=UTF-8)
@ResponseBody
public List<Department> findAll(){ //查找所有部门
List<Department> depts=userService.findAllDepts();
return depts;
}
}
主要是要加上 @ResponseBody 即告诉前端 要返回的是json格式的数据(其实不只是List可以转成json 普通类型 javabean类型等 都可以转换 并按照json字符串返给前端)
此外
1.加粗样式参数 produces用来指定当前的请求希望得到什么类型的数据,这个参数在请求的时候会被放到请求头的Accept中。 只有当请求的Accept类型与控制器中使用produces指定的类型相同的时候才会被该控制器接受并处理。
加上这个参数之后可以访问到 localhost:8080/findAll 并显示数据
2.参数consumes用来指定该控制器要处理的请求的数据类型,所谓媒体类型就是指text/plain 或者application/json或者 text/html等等。
它们会被放在请求的请求头中,比如Content-Type: application/x-www-form-urlencoded表示请求的数据为key/value数据,
只有当请求数据与控制器在@RequestMapping中指定的数据相同的时候,指定的请求才会被该控制器处理。
但是 加上这个consumes参数为什么不能获取controller中设置的数据呢??(有待解决)ps:我认为是前端还没发请求(所以默认处理的请求和@RequestMapping中指定的数据不一致)
于是访问时有如下错误:
待日后查看把…