Spring3MVC的学习
一:搭建环境(MyEclipse8.5下):
1、导入spring3.0.5的所有jar包。
org.springframework.aop-3.0.3.RELEASE.jar |
spring的aop面向切面编程 |
org.springframework.asm-3.0.3.RELEASE.jar |
spring独立的asm字节码生成程序 |
org.springframework.beans-3.0.3.RELEASE.jar |
IOC的基础实现 |
org.springframework.context-3.0.3.RELEASE.jar |
IOC基础上的扩展服务 |
org.springframework.core-3.0.3.RELEASE.jar |
spring的核心包 |
org.springframework.expression-3.0.3.RELEASE.jar |
spring的表达式语言 |
org.springframework.web-3.0.3.RELEASE.jar |
web工具包 |
org.springframework.web.servlet-3.0.3.RELEASE.jar |
mvc工具包 |
2、修改web.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<servlet>
<servlet-name>springMvc</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlt
</servlet-class>
<init-param>
<param-name>
contextConfigLocation
</param-name>
<param-value>
/WEB-INF/config/spring-servlet.xml
</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springMvc</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>
Spring-servlet.xml文件是springMVC的配置文件。Web.xml文件配置springMVC的核心控制器:DispatcherServlet .java
3、新建spring-servlet.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:util="http://www.springframework.org/schema/util" xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd">
<!--自动搜索web包中的类,已完成bean的创建和自动依赖注入 -->
<context:component-scan base-package="com.unicom.ucloud"/>
<!-- 支持spring3.0新的mvc注解 -->
<mvc:annotation-driven/>
<!—按照类的级别注解-->
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/>
<!--启动spring MVC的注解功能,完成请求和注解POJO的映射 -->
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>
<!-- 对模型视图的解析,给视图路径添加前后缀 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="/WEB-INF/jsp/" p:suffix=".jsp">
<!-- 如果使用jstl,配置下面属性 -->
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
</bean>
</beans>
SpringMVC的执行过程是:
1. 用户发送请求给服务器。url:user.do
2. 服务器收到请求。发现DispatchServlet可以处理。于是调用DispatchServlet。
3. DispatchServlet内部,通过HandleMapping检查这个url有没有对应的Controller。如果有,则调用Controller。
4. Controller开始执行。
5. Controller执行完毕后,如果返回字符串,则ViewResolver将字符串转化成相应的视图对象;如果返回ModelAndView对象,该对象本身就包含了视图对象信息。
6. DispatchServlet将执视图对象中的数据,输出给服务器。
7. 服务器将数据输出给客户端。
在项目中还是分三层架构进行设计,表示层springmvc实现。
Web:使用Controller来控制。
二:简单案例:
1、项目的基本架构如图:
2、源代码清单:
//实体类代码
@Component //可以完成该类的自动创建和注解
public class Person implements Serializable{
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
//web下的Controller代码:
@Controller //表示该类是控制器
@RequestMapping("/json.action")//请求该Controller的路径
public class JsonController {
private Person p;
@RequestMapping(params="cmd=testJson")
public String testJson(HttpServletRequest request){
System.out.println("testJson is runing...");
String name=request.getParameter("name");
System.out.println(name);
return "ok";
}
public Person getP() {
return p;
}
@Resource
public void setP(Person p) {
this.p = p;
}
}
index.jsp的页面;
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body>
<a href="${pageContext.request.contextPath }/json.action?cmd=testJson&name=abc">test</a>
</body>
</html>
ok.jsp页面:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
</head>
<body>
spring MVC is Ok;
</body>
</html>
Spring注解知识的学习:
1、@RequestMapping
在类前面定义,则将url和类绑定。
在方法前面定义,则将url和类的方法绑定
2 方法的返回值String(建议)
返回值找对应的页面:prefix前缀+返回值+suffix后缀
public String testJson(HttpServletRequest request){
System.out.println("testJson is runing...");
String name=request.getParameter("name");
System.out.println(name);
return "ok";
}
也可以返回ModelMap、ModelAndView、map、List、Set、Object、无返回值。 一般建议返回字符串!
3、@Component 、@Repository @Service 、@Controller 等价的,在类的头上加上该标记,就可以完成bean的创建和自动注入。
(结合<context:component-scan base-package=””>自动搜索类)
@Component :创建的bean name=(类的首字母小写)相当于一个map集合
4、@Resource 自动注解 按照name查找,name查找不到,按照type查找,(建议使用)。
@ResponseBody :用于与ajax交互的函数上。
5、对于<mvc:anotation-driven/>的理解。
<mvc:annotation-driven /> 是一种简写形式,完全可以手动配置替代这种简写形式,简写形式可以让初学都快速应用默认配置方案。<mvc:annotation-driven /> 会自动注册DefaultAnnotationHandlerMapping与AnnotationMethodHandlerAdapter 两个bean,是spring MVC为@Controllers分发请求所必须的。
并提供了:数据绑定支持,@NumberFormatannotation支持,@DateTimeFormat支持,@Valid支持,读写XML的支持(JAXB),读写JSON的支持(Jackson)。
后面,我们处理响应ajax请求时,就使用到了对json的支持。
后面,对action写JUnit单元测试时,要从spring IOC容器中取DefaultAnnotationHandlerMapping与AnnotationMethodHandlerAdapter 两个bean,来完成测试,取的时候要知道是<mvc:annotation-driven />这一句注册的这两个bean。
如何替换<mvc:annotation-driven />?他到底做了什么工作,请看,最后面的 十九节 <mvc:annotation-driven /> 到底做了什么工作。
理解:
<mvc:anotation-driven/>可以替代下面这些:
<!—提供对类的注解-à
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/>
<!--启动spring MVC的注解功能,完成请求和注解POJO的映射,(提供方法级别的注解) -->
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="cacheSeconds" value="0"/>
<property name="messageConverters">
<list>
<bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"/>//对json的支持
</list>
</property>
</bean>
二、转发与重定向
可以通过redirect/forward:url方式转到另一个Action进行连续的处理。
可以通过redirect:url 防止表单重复提交。
写法如下:
return "forward:/order/add";
return "redirect:/index.jsp";
带参数重定向--RedirectAttributes
用户保存或修改后,为了防止用户刷新浏览器(F5)导致表单重复提交,一般在保存或修改操作之后会redirect到一个结果页面(不是forward),同时携带参数,如操作成功的提示信息。因为是Redirect,Request里的attribute不会传递过去。Spring在3.1才提供了这个能力--RedirectAttributes。 反复按F5,操作成功的提示信息也不会再次出来(总共只出现一次),效果很理想。
Java代码
1. public String save(@ModelAttribute("group") Group group, RedirectAttributes redirectAttributes) {
2. accountManager.saveGroup(group);
3. redirectAttributes.addFlashAttribute("message", "操作成功");
4. return "redirect:/account/group/";
5. }
三、springMVC下的ajax操作:
使用json的数据格式。利用jackson框架来完成对json的操作(springMVC支持对json的操作)。
1、 需要的jar包:jackson-all-1.8.10.jar(参考资料:jackson学习资料.doc)
2、 页面(使用jquery的ajax函数):
3、Controller编写:
注意:对于ajax操作时,Controller的处理函数上要加:@ResposneBody注解
看清楚ajax的dataType是什么,如果是json,就需要将处理后的java对象转换成json字符串,最后返回。
对json的操作,我使用的是jackson框架。
POJOJsonUtil.java的源代码:
/**
* jackson框架对java和json数据的转换工具
* @author Administrator
*
*/
public class POJOJsonUtil {
private static final ObjectMapper mapper=new ObjectMapper();
/**
* 将java对象转换成json字符串
* @param obj 要转换的java对象
* @return json字符串
*/
public static String JavaBeanToJson(Object obj){
StringWriter sw=new StringWriter();//创建一个缓冲区字符串
try {
mapper.writeValue(sw,obj);//将java对象转换成字符输出流
} catch (JsonGenerationException e) {
e.printStackTrace();
} catch (JsonMappingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
if(sw!=null){
try {
sw.flush();//刷新缓冲区
sw.close();//关闭流
} catch (IOException e) {
e.printStackTrace();
}
}
return sw.toString();
}
/**
* 将json字符串转换成java对象
* @param jsonString 传入的json字符串
* @return java对象
*/
public static Object JsonToJava(String jsonString){
Object obj=null;
try {
obj=mapper.readValue(jsonString, Object.class);
} catch (JsonParseException e) {
e.printStackTrace();
} catch (JsonMappingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return obj;
}
/**
* 测试
* @param args
*/
public static void main(String[] args) {
Person p=new Person();
p.setName("abc");
p.setAge(12);
System.out.println(JavaBeanToJson(p));
String jsonString="{\"name\":\"abc\",\"age\":12}";//需要注意转义字符
System.out.println(JsonToJava(jsonString));
}
}