Spring3MVC的学习

 

                       Spring3MVC的学习

一:搭建环境(MyEclipse8.5下):

1、导入spring3.0.5的所有jar包。

 spring3.0中相关jar包的含义

org.springframework.aop-3.0.3.RELEASE.jar

springaop面向切面编程

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.       用户发送请求给服务器。urluser.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";

    }

也可以返回ModelMapModelAndViewmapListSetObject、无返回值。 一般建议返回字符串!

 

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 /> 会自动注册DefaultAnnotationHandlerMappingAnnotationMethodHandlerAdapter 两个bean,spring MVC@Controllers分发请求所必须的。


并提供了:数据绑定支持,@NumberFormatannotation支持,@DateTimeFormat支持,@Valid支持,读写XML的支持(JAXB),读写JSON的支持(Jackson)。
后面,我们处理响应ajax请求时,就使用到了对json的支持。
后面,对actionJUnit单元测试时,要从spring IOC容器中取DefaultAnnotationHandlerMappingAnnotationMethodHandlerAdapter 两个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),同时携带参数,如操作成功的提示信息。因为是RedirectRequest里的attribute不会传递过去。Spring3.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、 页面(使用jqueryajax函数):

3Controller编写:

 

注意:对于ajax操作时,Controller的处理函数上要加:@ResposneBody注解

看清楚ajaxdataType是什么,如果是json,就需要将处理后的java对象转换成json字符串,最后返回。

json的操作,我使用的是jackson框架。

POJOJsonUtil.java的源代码:

 /**

 * jackson框架对javajson数据的转换工具

 * @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));

    }

}

 

 

 


你可能感兴趣的:(springMVC)