SpringMVC注解
@RequestMapping
可以作用在类上或者方法上。
作用在类上就是请求URL的第一级访问目录,不写的话就是应用的根目录。
作用在方法上就是请求URL的第二季访问目录,和上面的一起组成访问虚拟路径,
参数:
**value:**用于指定请求的URL,当参数括号里面只写了一个参数就默认是URL参数
**method:**用于用于指定请求的方式 要求赋值的是枚举类型 例如 RequestMethod类的.POST
**params:**用于指定限制请求参数的条件,他支持简单的表达式,要求请求参数的key和value必须配置的一模一样
params = {“accountName”},表示请求参数必须有accountName
params = {“money!100”}表示请求参数money不能是100
通过配置spring-mvx.xml改变请求前后缀
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/jsp/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
SpringMVC相关组件
前端控制器:DispatcherServlet
处理器映射器:HandlerMapping
处理器适配器:HandlerAdapter
处理器:Handler
视图解析器:ViewResolver
视图:View
SpringMVC的数据响应
页面跳转
-
直接返回请求资源的路径字符串
将返回的字符串与视图解析器的前后缀拼接后跳转
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/jsp/"></property> <property name="suffix" value=".jsp"></property> </bean>
@RequestMapping("/1") public String save(){ System.out.println("sinni"); return "1"; }
这样通过配置文件自动添加了前后缀,在RequestMapping中就直接写文件名省略路径和后缀
-
通过ModelAndView对象返回
//通过对ModelAndView对象的具体设置获取到数据域和页面跳转 @RequestMapping("/2") public ModelAndView save2(){ ModelAndView modelAndView = new ModelAndView(); modelAndView.setViewName("page1"); modelAndView.addObject("username","2"); return modelAndView; } //通过String类型路径返回值跳转页面,通过参数Module设置数据域 @RequestMapping("/3") public String save3(Model model){ model.addAttribute("username","3"); return "page1"; } //通过参数获取Spring提供的HttpServletRequest 对象进行数据域的操作 @RequestMapping("/4") public String save4(HttpServletRequest request){ request.setAttribute("username",4); return "page1"; }
回写数据
-
直接返回字符串的两种方法
- //通过参数获取Spring提供的HttpServletResponse对象进行写入操作
- @ResponseBody
//通过参数获取Spring提供的HttpServletResponse对象进行写入操作 @RequestMapping("/5") public void save5(HttpServletResponse resp) throws IOException { resp.getWriter().write("5的数据"); resp.getWriter().print("5的数据"); } //通过@ResponseBody把本身是资源路径标识的String类型返回值转换为写入到页面的String @RequestMapping("/6") @ResponseBody public String save6(){ String user = "6的数据"; return user; }
-
返回对象或者集合
//通过<mvc:annotation-driven/>返回了json格式的字符
@RequestMapping("/7")
@ResponseBody
public User save7(){
User user = new User("haha",22);
return user;
}//能返回json是因为在spring-mvc配置过 <mvc:annotation-driven/>了
SpringMVC获得数据响应
获得基本类型参数
//获得基本类型参数
@RequestMapping("/8")
@ResponseBody
public String save8(String username, int age) {
System.out.println(username);
System.out.println(age);
return username + "的年龄是" + age;
}
这边是在请求地址后面直接加上(?键值对&键值对)的形式按照参数的类型获取到就可以得到相应参数了
获得pojo类型参数
//获得pojo类型参数
@RequestMapping("/9")
@ResponseBody
public String save9(User user) {
return user.toString();
}
把和上面的一样,不过这次是根据pojo的成员来给值
获得数组
//获得数组strs[]
@RequestMapping("/10")
@ResponseBody
public String save10(String[] strs) {
return Arrays.asList(strs).toString();
}
这边还是通过上面的方式,举例
URL?strs=haah&strs=huhu&strs=ttt
(这里的链接关键是看参数,相同参数名赋值多个就是列表)
页面输出
[haah, huhu, ttt]
获得集合
//获得集合
@RequestMapping("/11")
@ResponseBody
public String save11(VO vo) {
return vo.toString();
}
通过表单的方式逐一赋值
<form action="${pageContext.request.contextPath}/11" method="post">
<input type="text" name="userList[0].name"><br>
<input type="text" name="userList[0].age"><br>
<input type="text" name="userList[1].name"><br>
<input type="text" name="userList[1].age"><br>
<input type="submit" value="tijn">
</form>
ajax方式获得集合
<script src="${pageContext.request.contextPath}/js/jquery-1.7.2.js"></script>
<script>
var userList = new Array();
userList.push({name:"王汉桑",age:18});
userList.push({name:"李四",age:181});
$.ajax({
type:"POST",
url:"${pageContext.request.contextPath}/12",
data:JSON.stringify(userList),
contentType:"application/json;charset=utf-8"
});
</script>
//ajax方式获得集合
@RequestMapping("/12")
@ResponseBody
public void save12(@RequestBody List<User> userList) {
System.out.println(userList);
}