hjr-JAVA:SpringMVC进阶

#URL
在view中,每个文件夹对应一个网站的模块,比如user,这样就构成了路径view/user,而user里面可能也有增删改查四个页面
路径又变成view/user/listview/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标签标注的方法的请求。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

架构师小侯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值