springmvc与前端数据交互实例
Q:为什么使用逻辑视图
A:将控制器中请求处理的逻辑和视图中的渲染实现解耦合是springmvc的一大特征。
控制器方法都是没有直接产生浏览器中渲染所需的HTML。这些方法只是将一些数据填充到模型中,然后通过模型传递给一个用来渲染的视图(逻辑视图),然后将逻辑视图名字以及local对象传入视图解析器中,返回一个view对象(view接口接收模型以及servlet中的request以及response),然后将渲染结果放置在response中。
适用于逻辑解释器 就是加前缀以及后缀来确定jsp的实际位置。
可以自定义对象,然后让对象携带数据 传送到jsp中 数据一般藏在modelview modelmap session。
一、从页面接收参数
Spring MVC接收请求提交的参数值的几种方法:
- 使用HttpServletRequest获取。
@RequestMapping("/login.do") public String login(HttpServletRequest request){ String name = request.getParameter("name") String pass = request.getParameter("pass") }
表单的信息都会存储在request请求体中,当使用httpservletrequest时候 可以获取request,然后根据名称获取相对应的元素。
- 使用@RequestParam注解。
@RequestMapping("/login.do") public String login(HttpServletRequest request, String name, @RequestParam("pass")String password) // 表单属性是pass,用变量password接收 { syso(name); syso(password) }
使用注解@requestparam来获取表单元素
-
- 使用自动机制封装成实体参数。
<form action="login.do">
用户名:<input name="name"/>
密码:<input name="pass"/>
<input type="submit" value="登陆">
</form>
//封装的User类
public class User{
private String name;
private String pass;
}
@RequestMapping("/login.do")
public String login(User user)
{
syso(user.getName());
syso(user.getPass());
}
应该要求表单属性与类属性一致才可以对应。然后将表单元素
二、向页面传值
当Controller组件处理后,需要向响应JSP传值时,可以使用的方法:
1),使用HttpServletRequest 和 Session 然后setAttribute(),就和Servlet中一样
Model数据会利用HttpServletRequest的Attribute传值到success.jsp中
@RequestMapping("/login.do")
public ModelAndView login(String name,String pass){
User user = userService.login(name,pwd);
Map<String,Object> data = new HashMap<String,Object>();
data.put("user",user);
return new ModelAndView("success",data);
}
2),使用ModelAndView对象
3),使用ModelMap对象
使用ModelMap参数对象示例:
ModelMap数据会利用HttpServletRequest的Attribute传值到success.jsp中
@RequestMapping("/login.do")
public String login(String name,String pass ,ModelMap model){
User user = userService.login(name,pwd);
model.addAttribute("user",user);
model.put("name",name);
return "success";
}
4),使用@ModelAttribute注解
使用@ModelAttribute示例
在Controller方法的参数部分或Bean属性方法上使用
@ModelAttribute数据会利用HttpServletRequest的Attribute传值到success.jsp中
@RequestMapping("/login.do")
public String login(@ModelAttribute("user") User user){
//TODO
return "success";
}
@ModelAttribute("name")
public String getName(){
return name;
}
5)Session存储:可以利用HttpServletReequest的getSession()方法
@RequestMapping("/login.do")
public String login(String name,String pwd
ModelMap model,HttpServletRequest request){
User user = serService.login(name,pwd);
HttpSession session = request.getSession();
session.setAttribute("user",user);
model.addAttribute("user",user);
return "success";
}
6)自定义Map
@ResponseBody
@RequestMapping(value = "/updatestatus", method = RequestMethod.POST)
public Map<String, Object> updateStatus(HttpServletRequest request) {
Map<String, Object> result = new HashMap<String, Object>();
String id = request.getParameter("id");
SystemAdministrator sysadmin=systemAdminBiz.get(Integer.valueOf(id));
sysadmin.setStatus(1);
boolean flag = systemAdminBiz.update(sysadmin);
result.put("status", flag);
return result;
}
@RequestMapping(value = "/list", method = {RequestMethod.POST,RequestMethod.GET})
public String queryAdministrator(HttpServletRequest request,ModelMap model) {
Integer roleId = request.getParameter("roleListById") == null ? 0 : Integer.parseInt(request.getParameter("roleListById"));
Map<String, Object> properties = new HashMap<String, Object>();
if(roleId.intValue() > 0) {
properties.put("role:=", roleId);
model.put("roleId", roleId);
}
List<SystemAdministrator> administrator = systemAdminBiz.find(properties);
List<SystemRole> systemRole = systemRoleBiz.getAll();
model.put("administratorList", administrator);
model.put("roleList", systemRole);
return "sys_admin_list";
}
7)Spring MVC 默认采用的是转发来定位视图,如果要使用重定向,可以如下操作
1,使用RedirectView
2,使用redirect:前缀
public ModelAndView login(){
RedirectView view = new RedirectView("regirst.do");
return new ModelAndView(view);
}
或者用如下方法,工作中常用的方法:
public String login(){
//TODO
return "redirect:regirst.do";
}
Spring MVC 从页面向Controller传递参数的方式
Spring MVC从页面向Controller传值的方式
验证代码:https://files.cnblogs.com/files/peiyangjun/20180104_springMVC_easyui.zip
从页面向Controller 传值的方式有很多,本文整理出常用的从页面向Controller传值的几种方式:
1、通过HttpServletRequest 向后台传递数据
页面程序如下:
<h2>利用HttpServletRequest传数据</h2>
<form action="loginToJson">
用户名:<input name="name" /> 密码:<input name="pass" /> <input
type="submit" value="登陆">
</form>
后台程序段如下:
@ResponseBody
@RequestMapping(value="/loginToJson",method=RequestMethod.POST)
public String loginToJson(HttpServletRequest request) {
User user = new User();
user.setUserName(request.getParameter("name"));
user.setPassword(request.getParameter("pass"));
return JSON.toJSONString(user);
}
使用HttpServletRequest根据属性名字来获取表单信息
2、通过参数向Controller传递值
前台程序如下:
<h2>利用函数参数传数据</h2>
<form action="loginByVariable" method="post">
用户名:<input name="name" /> 密码:<input name="pass" />
<input type="submit" value="登陆">
</form>
后台程序如下:
@RequestMapping(value="/loginByVariable",method=RequestMethod.POST)
public String loginToSession(HttpServletRequest request,ModelMap map,String name,String pass) {
User user = new User();
user.setUserName(name);
user.setPassword(pass);
map.put("user", user);
System.out.println(user);
return "mySession";
}
注意:前台<input name="name" />中的name属性的值,必须和后台函数参数中的String name中的形参名一致,否则从后台取不到值。
将表单的元素作为参数传入
3、利用函数参数,对象传递值到Controller
前置条件,对象的定义代码:
注意这里,User对象的属性名为userName和password,并有getter和setter属性
public class User{
@Override
public String toString() {
return "User [userName=" + userName + ", password=" + password + "]";
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
private String userName;
private String password;
}
前台程序如下:
注意:userName和password必须和对象属性名称一致。
<h2>利用函数参数对象传数据</h2>
<form action="loginByObject" method="post">
用户名:<input name="userName" /> 密码:<input name="password" /> <input
type="submit" value="登陆">
</form>
后台程序如下:
@RequestMapping(value="/loginByObject",method=RequestMethod.POST)
public String loginToSession(ModelMap map,User user) {
User user1 = new User();
user1.setUserName(user.getUserName());
user1.setPassword(user.getPassword());
System.out.println(user1+" Object");
map.put("user", user1);
return "mySession";
}
将表单属性信息存入已经设定好的模型中,模型的属性与表单的属性是一致的。并且模型中必须设有set get方法。
4、利用函数参数@RequestParam参数传递据
前台代码如下:
<br>
<h2>利用函数参数@RequestParam参数传递据</h2>
<form action="loginByRequestParm" method="post">
用户名:<input name="name" /> 密码:<input name="pass" /> <input
type="submit" value="登陆">
</form>
后台程序如下:
@RequestMapping(value="/loginByRequestParm",method=RequestMethod.POST)
public String loginToSessiona(HttpServletRequest request,ModelMap map,
@RequestParam("name") String UserName,@RequestParam String pass) {
User user = new User();
user.setUserName(UserName);
user.setPassword(pass);
map.put("user", user);
System.out.println(user+"requestParam");
return "mySession";
}
注意:@RequestParam("name")中如果有参数,name必须为页面中属性的值,如果没有参数,则参数名,必须和页面中属性的值相同,如页面中pass,则在@RequestParam中,则可以不指定参数,但形参的名字必须为pass
5、 通过URL传递参数 @PathVariable
具体代码如下:
@Controller
public class TestController {
@RequestMapping(value="/user/{userId}/roles/{roleId}",method = RequestMethod.GET)
public String getLogin(@PathVariable("userId") String userId,
@PathVariable("roleId") String roleId){
System.out.println("User Id : " + userId);
System.out.println("Role Id : " + roleId);
return "hello";
}
@RequestMapping(value="/product/{productId}",method = RequestMethod.GET)
public String getProduct(@PathVariable("productId") String productId){
System.out.println("Product Id : " + productId);
return "hello";
}
@RequestMapping(value="/javabeat/{regexp1:[a-z-]+}",
method = RequestMethod.GET)
public String getRegExp(@PathVariable("regexp1") String regexp1){
System.out.println("URI Part 1 : " + regexp1);
return "hello";
}
}