#URL
在view中,每个文件夹对应一个网站的模块,比如user,这样就构成了路径view/user,而user里面可能也有增删改查四个页面
路径又变成view/user/list
或view/user/updata
…
这个也是浏览器url的后缀而这些路径通过@RequestMapping
定义:
//这里的@RequestMapping("/user")和下面的("/list")反应了user/list的路径结构
@Controller
@RequestMapping("/user")
public class UserController {
//List是一个接口,而ArrayList是一个类,所以后者可以直接`new`,前者不行。
private static List<User> userList = new ArrayList<User>();
//static静态块,只会执行一次
static{
//下面的User都是数据Model
userList.add(new User(1,"用户1","123"));
userList.add(new User(2,"用户2","123"));
}
@RequestMapping("/list")
public ModelAndView list() {
ModelAndView mav = new ModelAndView();
//此处把所有数据存到mav,最后return mav给"user/list"
mav.addObject("userList",userList);
mav.setViewName("user/list");
System.out.println("list");
return mav;
}
}
使用上面的代码,通过ArrayList类型将数据Model的多个对象打包后,一起返回到了,mav.setViewName("user/list");
中的路径,这样在list文件中,就可以使用所有的数据了。
其中new User(1,"用户1","123")
为对Model赋值,这个可以用数据库操作代替,而Model的具体写法见下。
注意:
ModelAndView的包是
import org.springframework.web.servlet.ModelAndView;
而不是
import org.springframework.web.portlet.ModelAndView;
如果弄错前端收不到值
##Model
可以看到上面的user控制器直接使用了数据model,而model的定义:
新建包com.apache.model
,新建User类
public class User {
//这些属性都是私有的并通过get/set访问的优点是加了一层过滤
private int id;
private String name;
public User(int id, String name) {
super();
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
#view
view/list.jsp
<%@ page language="java" pageEncoding="UTF-8" %>
<!--下面引用的的jstl是jsp的一个技术,标签可以可以实现一部分后端代码的功能-->
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<table>
<tr>
<th>编号</th>
<th>姓名</th>
</tr>
<!--此处的userList为Controler中`mav.addObject("userList",userList);`进来的-->
<!--数据显示到界面-->
<c:forEach var="user" items="${userList}">
<tr>
<td>{$User.id}</td>
<td>{$User.name}</td>
</tr>
</c:forEach>
</table>
</body>
</html>
上面为了使用JSTL库,需要导入standard.jar和jstl.jar两个包。
其余增删改都同理,并且上面的new user(1.“用户1”)可以换成操作数据库,查询语句并add到集合中
而增删改与查不同的地方是需要一个id,我们把id在点击时通过url传给控制器
控制器这么接收:
@RequestMapping("/updata")
ModelAndView updata (@RequestParam(value = "id") String id)
{
//在这里通过id变量操作获取的id参数值
//可以操作数据库如updata
return mav;
}
#Ajax与控制器各种数据交互
##前台JSON往后台控制器传值
前台:
ajax如果不写
datatype:"json",
contentType : 'application/json;charset=utf-8',
会报415错误
JSON如果不是JSON数据而是JS数组对象则需要先进行转换
var jsonData = [];
jsonData = JSON.stringify(jsObj);
如果是JSON数据必须加上(1)(2)两个标签
在方法上面:
(1)@ResponseBody //表示返回的是json对象
@RequestMapping(value="/xxx", method = RequestMethod.POST, produces=“application/json”)
在传参中:
xxx((2)@RequestBody List xxx)
##前台二维数组往后台控制器传值
xxx(@RequestBody List<Model> xxx)
如果用List<Moldel>
作为参数必须保证传入的JSON的Key与Model的属性完全对应,否则会报400错误
或者用
xxx(@RequestBody List<Map<String,Object>>
可以不用考虑匹配问题,注意,匹配指的是字段不允许出现在Model中找不到的字符,允许Modle有2个属性,JSON只有一个字段的情况
##前台一维数组往后台控制器传值
用xxx(@RequestBody Model xxx)
或者xxx(@RequestBody List<String>>``xxx(@RequestBody Map<key,value>>
不需要考虑二维数组匹配的问题
##自定义标签
新建接口
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* XXX是标签名
* @author hjr
* 使用时直接吧@XXX放到写到要访问的方法就行
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface XXX {
}
作用,比如在拦截器中
XXX annotation = method.getAnnotation(XXX.class);
if (annotation != null) {
}
拦截器中代码的作用是可以判断,请求的是方法是否被XXX标签标注。如果标注了则不为空,此处的功能是控制拦截器只拦截被XXX标签标注的方法的请求。