第十四章 springmvc快速入门(注解版本)

1)springmvc快速入门(传统版)

步一:创建springmvc-day02这么一个web应用

步二:导入springioc,springweb和springmvc相关的jar包

------------------------------------------------------springWEB模块

org.springframework.web-3.0.5.RELEASE.jar

org.springframework.web.servlet-3.0.5.RELEASE.jar(mvc专用)

------------------------------------------------------springIOC模块

org.springframework.asm-3.0.5.RELEASE.jar

org.springframework.beans-3.0.5.RELEASE.jar

org.springframework.context-3.0.5.RELEASE.jar

org.springframework.core-3.0.5.RELEASE.jar

org.springframework.expression-3.0.5.RELEASE.jar

步三:在/WEB-INF/下创建web.xml文件

<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>

步四:创建HelloAction.java控制器类

@Controller
public class HelloAction {
@RequestMapping(value = "/hello")
public String helloMethod(Model model) throws Exception {
System.out.println("HelloAction::helloMethod()");
model.addAttribute("message", "这是我的第二个springmvc应用程序");
return "/success.jsp";
}
}

步五:在/WebRoot/下创建success.jsp

<%@ page language="java" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>这是我的第二个springmvc应用程序</title>
</head>
<body>
success.jsp
<br /> ${message}
</body>
</html>

步六:在/src/目录下创建spring.xml配置文件

   <!-- Action控制器 -->
<context:component-scan base-package="cn.itcast.javaee.springmvc.helloannotation" />
<!-- 基于注解的映射器(可选) -->
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" /> <!-- 基于注解的适配器(可选) -->
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" /> <!-- 视图解析器(可选) -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" />

步七:部署web应用到tomcat中,通过浏览器访问如下URL:

http://127.0.0.1:8080/springmvc-day02/hello.action

第十五章 一个Action中,可以写多个类似的业务控制方法

1)通过模块根路径 + 功能子路径 = 访问模块下子功能的路径

@Controller
@RequestMapping(value = "/user")
public class UserAction {
@RequestMapping(value = "/add")
public String add(Model model) throws Exception {
System.out.println("HelloAction::add()");
model.addAttribute("message", "增加用户");
return "/success.jsp";
} @RequestMapping(value = "/find")
public String find(Model model) throws Exception {
System.out.println("HelloAction::find()");
model.addAttribute("message", "查询用户");
return "/success.jsp";
}
}

增加用户:http://127.0.0.1:8080/myspringmvc-day02/user/add.action

查询用户:http://127.0.0.1:8080/myspringmvc-day02/user/find.action

第十六章 在业务控制方法中写入普通变量收集参数

1)可以在业务控制方法中,以参数形式收集客户端参数,springmvc采用方法参数形式的

@Controller
@RequestMapping(value = "/user")
public class UserAction {
@RequestMapping(value = "/add")
public String add(Model model, int id, String name, Double sal) throws Exception {
System.out.println("HelloAction::add()");
System.out.println(id + ":" + name + ":" + sal);
model.addAttribute("message", "增加用户");
return "/success.jsp";
}
}

http://127.0.0.1:8080/myspringmvc-day02/user/add.action?id=1&name=zhaojun&sal=5000

第十七章 限定某个业务控制方法,只允许GET或POST请求方式访问

1)可以在业务控制方法前,指明该业务控制方法只能接收GET或POST的请求

@Controller
@RequestMapping(value = "/user")
public class UserAction {
@RequestMapping(value = "/add", method = RequestMethod.POST)
public String add(Model model, int id, String name, double sal) throws Exception {
System.out.println("HelloAction::add()::POST");
System.out.println(id + ":" + name + ":" + sal);
model.addAttribute("message", "增加用户");
return "/success.jsp";
}
}

如果不书写method=RequestMethod.POST的话,GET和POST请求都支持

第十八章 在业务控制方法中写入Request,Response等传统web参数

1)可以在业务控制方法中书写传统web参数,这种方式我们不提倡,耦合了

@Controller
@RequestMapping(value = "/user")
public class UserAction {
@RequestMapping(value = "/add", method = RequestMethod.POST)
public void add(HttpServletRequest request, HttpServletResponse response) throws Exception {
System.out.println("HelloAction::add()::POST");
int id = Integer.parseInt(request.getParameter("id"));
String name = request.getParameter("name");
double sal = Double.parseDouble(request.getParameter("sal"));
System.out.println(id + ":" + name + ":" + sal);
request.getSession().setAttribute("id", id);
request.getSession().setAttribute("name", name);
request.getSession().setAttribute("sal", sal);
response.sendRedirect(request.getContextPath() + "/register.jsp");
}
}

第十九章 在业务控制方法中写入模型变量收集参数,且使用@InitBind来解决字符串转日期类型

1) 在默认情况下,springmvc不能将String类型转成java.util.Date类型,所有我们只能在Action

中自定义类型转换器

<form action="${pageContext.request.contextPath}/user/add.action" method="POST">
编号:<input type="text" name="id" value="${id}" /><br />
姓名:<input type="text" name="name" value="${name}" /><br />
薪水:<input type="text" name="sal" value="${sal}" /><br />
入职时间:<input type="text" name="hiredate"
value='<fmt:formatDate value="${hiredate}" type="date"/>' /><br />
<input type="submit" value="注册" />
</form>
@Controller
@RequestMapping(value = "/user")
public class UserAction {
@InitBinder
protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) throws Exception {
binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), true));
} @RequestMapping(value = "/add", method = RequestMethod.POST)
public String add(int id, String name, double sal, Date hiredate, Model model) throws Exception {
System.out.println("HelloAction::add()::POST");
model.addAttribute("id", id);
model.addAttribute("name", name);
model.addAttribute("sal", sal);
model.addAttribute("hiredate", hiredate);
return "/register.jsp";
}
}

第二十章 在业务控制方法中写入User,Admin多个模型收集参数

1) 可以在业务控制方法中书写1个模型来收集客户端的参数

2) 模型中的属性名必须和客户端参数名一一对应

3) 这里说的模型不是Model对象,Model是向视图中封装的数据

@Controller
@RequestMapping(value = "/user")
public class UserAction {
@InitBinder
protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) throws Exception {
binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), true));
} @RequestMapping(value = "/add", method = RequestMethod.POST)
public String add(User user, Model model) throws Exception {
System.out.println("HelloAction::add()::POST");
model.addAttribute("user", user);
return "/register.jsp";
}
}

第二十一章 在业务控制方法中写入包装User的模型来收集参数

可以在业务控制方法中书写0个或多个模型来收集客户端的参数

1) 如果多个模型中有相同的属性时,可以用user.name或admin.name来收集客户端参数

2) 用一个新的模型将User和Admin再封装一次

User.java

public class User {
private Integer id;
private String name;
private Double sal;
private Date hiredate; public User() {
} public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Double getSal() {
return sal;
} public void setSal(Double sal) {
this.sal = sal;
} public Date getHiredate() {
return hiredate;
} public void setHiredate(Date hiredate) {
this.hiredate = hiredate;
} @Override
public String toString() {
return this.id + ":" + this.name + ":" + this.sal + ":" + this.hiredate;
}
}

Bean.java

public class Bean {
private User user;
private Admin admin; public Bean() {
} public User getUser() {
return user;
} public void setUser(User user) {
this.user = user;
} public Admin getAdmin() {
return admin;
} public void setAdmin(Admin admin) {
this.admin = admin;
}
}

PersonAction.java

@Controller
@RequestMapping(value = "/person")
public class PersonAction {
@InitBinder
protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) throws Exception {
binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), true));
} @RequestMapping(value = "/add", method = RequestMethod.POST)
public String add(Bean bean, Model model) throws Exception {
System.out.println(bean.getUser());
System.out.println(bean.getAdmin());
System.out.println("PersonAction::add()::POST");
model.addAttribute("bean", bean);
return "/register.jsp";
}
}

register.jsp

普通用户
<form action="${pageContext.request.contextPath}/person/add.action" method="POST">
编号:<input type="text" name="user.id" value="${bean.user.id}"/><br/>
姓名:<input type="text" name="user.name" value="${bean.user.name}"/><br/>
薪水:<input type="text" name="user.sal" value="${bean.user.sal}"/><br/>
入职时间:<input type="text" name="user.hiredate" value='<fmt:formatDate value="${bean.user.hiredate}" type="both" />'/><br/>
<input type="submit" value="注册"/>
</form>

第二十二章 在业务控制方法中收集数组参数

批量删除用户

@Controller
@RequestMapping(value = "/user")
public class UserAction {
@RequestMapping(value = "/delete")
public String deleteMethod(int[] ids, Model model) throws Exception {
System.out.println("UserAction::deleteMethod()");
System.out.println("需要删除的id为:");
for (int id : ids) {
System.out.print(id + " ");
}
model.addAttribute("message", "批量删除成功");
return "/success.jsp";
}
}

第二十三章 在业务控制方法中收集List<JavaBean>参数

批量注册用户

UserAction.java

@Controller
@RequestMapping(value = "/user")
public class UserAction {
@RequestMapping(value = "/addAll")
public String addAll(Bean bean, Model model) throws Exception {
for (User user : bean.getUserList()) {
System.out.println(user.getName() + ":" + user.getGender());
}
model.addAttribute("message", "批量增加用户成功");
return "/success.jsp";
}
}

Bean.java

public class Bean {
private List<User> userList = new ArrayList<User>(); public Bean() {
} public List<User> getUserList() {
return userList;
} public void setUserList(List<User> userList) {
this.userList = userList;
}
}

registerAll.jsp

<form action="${pageContext.request.contextPath}/user/addAll.action" method="POST">
姓名:<input type="text" name="userList[0].name" value="哈哈"/>
性别:<input type="text" name="userList[0].gender" value="男"/>
<hr/> 姓名:<input type="text" name="userList[1].name" value="呵呵"/>
性别:<input type="text" name="userList[1].gender" value="男"/>
<hr/> 姓名:<input type="text" name="userList[2].name" value="嘻嘻"/>
性别:<input type="text" name="userList[2].gender" value="女"/>
<hr/> <input type="submit" value="批量注册"/>
</form>

第二十四章 结果的转发和重定向

1) 在转发情况下,共享request域对象,会将参数从第一个业务控制方法传入第二个业务控制方法,

反之,重定向则不行

删除id=10号的用户,再查询用户

@Controller
@RequestMapping(value = "/user")
public class UserAction { @RequestMapping(value = "/delete")
public String delete(int id) throws Exception {
System.out.println("删除用户->" + id);
// 转发到find()
return "forward:/user/find.action";
// 重定向到find()
// return "redirect:/user/find.action";
} @RequestMapping(value = "/find")
public String find(int id) throws Exception {
System.out.println("查询用户->" + id);
return "/success.jsp";
} }

第二十五章 异步发送表单数据到JavaBean,并响应JSON文本返回

1) 提交表单后,将JavaBean信息以JSON文本形式返回到浏览器

bean2json.jsp

<form>
编号:<input type="text" name="id" value="1"/><br/>
姓名:<input type="text" name="name" value="哈哈"/> <br />
薪水:<input type="text" name="sal" value="5000" /><br />
<input type="button" value="异步提交注册" />
</form> <script type="text/javascript">
$(":button").click(function() {
var url = "${pageContext.request.contextPath}/user/add.action";
var sendData = {
"id" : 1,
"name" : "哈哈",
"sal" : 5000
};
$.post(url, sendData, function(backData, textStatus, ajax) {
alert(ajax.responseText);
});
});
</script>

User.java

public class User {
private Integer id;
private String name;
private Double sal;
public User() {
} public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Double getSal() {
return sal;
} public void setSal(Double sal) {
this.sal = sal;
}
}

UserAction.java

@Controller
@RequestMapping(value = "/user")
public class UserAction {
@RequestMapping(value = "/add")
public @ResponseBody User add(User user) throws Exception {
System.out.println(user.getId() + ":" + user.getName() + ":" + user.getSal());
return user;
}
}

spring.xml

<!-- Action控制器 -->
<context:component-scan base-package="cn.itcast.javaee.springmvc.app25" /> <!-- 配适器 -->
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">
<list>
<bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" />
</list>
</property>
</bean>

注意:使用mvc注解驱动可以代替spring.xml中适配器和映射器的配置信息,包括对json的配置

<mvc:annotation-driven/>

拦截器

springmvc拦截器是针对mapping的拦截配置。

配置方法:

1.针对某种mapping配置拦截器 符合mapping的handler才能被拦截到。

2.针对所有mapping配置全局拦截器:达到目的:所有请求都走这个拦截器配置。

springmvc框架自动将这个拦截器配置注入到所有的mapping中。

<!-- 拦截器 -->
<mvc:interceptors>
<!-- 多个拦截器,顺序执行 -->
<mvc:interceptor>
<mvc:mapping path="/**" />
<bean class="cn.itcast.springmvc.filter.HandlerInterceptor1"></bean>
</mvc:interceptor>
<mvc:interceptor>
<mvc:mapping path="/**" />
<bean class="cn.itcast.springmvc.filter.HandlerInterceptor2"></bean>
</mvc:interceptor>
</mvc:interceptors>

原理及场景分析:

package cn.itcast.springmvc.interceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView; public class HandlerInterceptor1 implements HandlerInterceptor { /**
* 此方法是在进行handler方法之前执行
* arg2:要执行的handler
* 场景:用户权限的拦截
*/
@Override
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1,
Object arg2) throws Exception { //返回一个false表示拦截,后边的拦截器不再执行
//如果返回一个true表示放行
System.out.println("HandlerInterceptor1..preHandle");
return true;
}
/**
* 此方法是在执行handler完毕,返回modenAndview之前执行
* 场景:对ModelAndView进行修改,比如统一添加页面导航(页面所需要的公用数据)
*/
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1,
Object arg2, ModelAndView arg3) throws Exception {
System.out.println("HandlerInterceptor1..postHandle"); }
/**
* 此方法是在执行handler完毕,且返回ModelAndView之后执行
* 场景:在这里记录执行的时间,并且在preHandle方法中也记录执行的开始时间,统一action执行时间,完成执行性能监视
* 场景:统一在这里进行日志记录
* 场景:统一进行异常处理
*/
@Override
public void afterCompletion(HttpServletRequest arg0,
HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
System.out.println("HandlerInterceptor1..afterCompletion"); } }

例子:

拦截器用户认证应用: 所有的请求都由用户认证拦截器进行拦截: 判断如果用户的session没有要跳转到登录页面

springMVC笔记二的更多相关文章

  1. SpringMVC笔记——SSM框架搭建简单实例

    落叶枫桥 博客园 首页 新随笔 联系 订阅 管理 SpringMVC笔记——SSM框架搭建简单实例 简介 Spring+SpringMVC+MyBatis框架(SSM)是比较热门的中小型企业级项目开发 ...

  2. SpringMvc 笔记

    整理出来是 SpringMvc 笔记 方便以后查询 框架太多了 不经常使用 忘记的可能性很大 自己整理一套笔记 一看就明白了 1 对比 原始请求响应流程 1 发送请求 --> 2 控制层 --& ...

  3. 《CMake实践》笔记二:INSTALL/CMAKE_INSTALL_PREFIX

    <CMake实践>笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE <CMake实践>笔记二:INSTALL/CMAKE_INSTALL_PREFIX &l ...

  4. jQuery源码笔记(二):定义了一些变量和函数 jQuery = function(){}

    笔记(二)也分为三部分: 一. 介绍: 注释说明:v2.0.3版本.Sizzle选择器.MIT软件许可注释中的#的信息索引.查询地址(英文版)匿名函数自执行:window参数及undefined参数意 ...

  5. Mastering Web Application Development with AngularJS 读书笔记(二)

    第一章笔记 (二) 一.scopes的层级和事件系统(the eventing system) 在层级中管理的scopes可以被用做事件总线.AngularJS 允许我们去传播已经命名的事件用一种有效 ...

  6. Python 学习笔记二

    笔记二 :print 以及基本文件操作 笔记一已取消置顶链接地址 http://www.cnblogs.com/dzzy/p/5140899.html 暑假只是快速过了一遍python ,现在起开始仔 ...

  7. WPF的Binding学习笔记(二)

    原文: http://www.cnblogs.com/pasoraku/archive/2012/10/25/2738428.htmlWPF的Binding学习笔记(二) 上次学了点点Binding的 ...

  8. webpy使用笔记(二) session/sessionid的使用

    webpy使用笔记(二) session的使用 webpy使用系列之session的使用,虽然工作中使用的是django,但是自己并不喜欢那种大而全的东西~什么都给你准备好了,自己好像一个机器人一样赶 ...

  9. AJax 学习笔记二(onreadystatechange的作用)

    AJax 学习笔记二(onreadystatechange的作用) 当发送一个请求后,客户端无法确定什么时候会完成这个请求,所以需要用事件机制来捕获请求的状态XMLHttpRequest对象提供了on ...

随机推荐

  1. Asp.Net Core使用Nginx实现反向代理

    ---恢复内容开始--- 前两篇文章介绍了使用Docker作为运行环境,用Nginx做反向代理的部署方法,这篇介绍一下使用Nginx配合.Net Core运行时直接在Liunx上裸奔的方法. 一.安装 ...

  2. 模块导入应用settings的字符串

    看django源码,感觉他的settings好高大上然后自己试试 以上是文件目录 email.py中代码 class Email: def send(self): print('发送email') M ...

  3. python数据类型及其特有方法

    一.运算符 in方法 "hello" in "abcdefghijklmnopqrstuvwxyz" "li" in ["gg&q ...

  4. 网站漏洞修复之最新版本UEditor漏洞

    UEditor于近日被曝出高危漏洞,包括目前官方UEditor 1.4.3.3 最新版本,都受到此漏洞的影响,ueditor是百度官方技术团队开发的一套前端编辑器,可以上传图片,写文字,支持自定义的h ...

  5. Python自动化运维——文件与目录差异对比

    Infi-chu: http://www.cnblogs.com/Infi-chu/ 模块:filecmp 安装:Python版本大于等于2.3默认自带 功能:实现文件.目录.遍历子目录的差异 常用方 ...

  6. Scala Tuple

    Python中的Tuple 元组将多样的对象集合到一起,元素不能修改,通过索引进行查找, 使用括号"()" 允许重复 Scala中的Tuple 概念跟Python是完全相同的 定义 ...

  7. 9.Mongodb与python交互

    1.与python交互 点击查看官方文档 安装python包 进入虚拟环境 sudo pip install pymongo 或源码安装 python setup.py 引入包pymongo impo ...

  8. 洛谷P3958 奶酪

    题目链接 这道题貌似可以用BFS来写吧qwq. 我用的是并查集,把联通的洞合并在同一个几何中,最后只需要判断是否存在上表面和下表面有相同集合的洞即可. 但是需要注意的是还有这样的一种情况:有一个大洞贯 ...

  9. javascript 自定义发布与订阅

    //声明一个类,与普通的类的声明不一样, function Girl() { //将类的事件声明成一个私有的属性,里面是一个对象 this._events = {} } /* { "失恋&q ...

  10. Coap协议学习笔记-第一篇

    1. 物联网应用上一般使用单片机(或者其他SOC),单片机的RAM内存一般只有20KB~~128KB左右,然而一个TCP协议栈可能就20KB,所以只能用UDP,因为UDP相对小很多,然后在UDP上加了 ...