新的开始——SpringMVC(一)


# 新的开始——SpringMVC(一)
  怀着十分激动的心情,我完成了SSH的自学阶段。开始进入到了SSM(Spring,SpringMVC,MyBatis)的阶段。星辰大海!!!本文概括:单纯SpringMVC的配置,配置式、注解式的controller的demo,一个Hello World 的demo,文末复习注解式的SpringAOP配置方式。  项目地址:GYiyouth/SpringMVCMyBatis  配置阶段,一开始可以配置地很复杂,把什么日志的包啊JSON啊都加上,不过这里我只配了SpringMVC与MyBatis的核心包(其实后者短期内都用不上),如下:UTF-81.81.84.3.7.RELEASE1.7.241.2.174.123.4.2

junitjunit${junit.version}testorg.springframeworkspring-core${spring.version}
org.springframeworkspring-web${spring.version}org.springframeworkspring-oxm${spring.version}org.springframeworkspring-tx${spring.version}
org.springframeworkspring-jdbc${spring.version}
org.springframeworkspring-webmvc${spring.version}org.springframeworkspring-aop${spring.version}
org.springframeworkspring-context-support${spring.version}
org.springframeworkspring-test${spring.version}org.mybatismybatis${mybatis.version}javax.servletjavax.servlet-api3.1.0
  配置完成以后,就开始啦,先是用配置式  SpringMVC的分发器,与struts2类似,需要在web.xml里配置,但是struts2是过滤器,而这里是用servlet。  在web.xml写下面这个servlet:springMVCorg.springframework.web.servlet.DispatcherServletcontextConfigLocationclasspath:SpringMVC-config.xmlspringMVC/  会拦截所有请求。  注意web.xml有一个顺序的问题,你如果把他写在下面,就可以在上面添加一些别的servlet,那么request就会先被别的servlet拦截。  这里的参数,我用红色标记了一下,如果这个配置文件在web文件夹下,那么不需要这个classpath,但我是用maven构建的项目骨架,所以还是习惯把配置文件放在resources文件夹里,那么就要用到这个classpath关键词了:  然后在上面提到的那个SpringMVC-config.xml里配置如下:
  这里相当于struts2里的struts.xml了吧。  注意,这里我配置了4个bean,第一个bean就是我自己写的类,那么第234个,如果不写,在Spring4.0后,也会使用默认的完成Spring内部MVC工作。  2:处理映射器:负责将Bean的名称为url进行查找。  3:处理器适配器:完成对HelloController的handleRequest方法进行调用  4:试图解析器:解析视图,将View呈现给用户。Controller类的实现  需要实现Controller接口,来处理/hello的请求:public class HelloController implements Controller{private static final Log logger = LogFactory.getLog(HelloController.class);/** 返回一个包含视图名,或者 视图名和视图模型的ModelAndView对象 @param httpServletRequest @param httpServletResponse @return @throws Exception/@Overridepublic ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {logger.info(“handleRequest 被调用”);ModelAndView mv = new ModelAndView();//添加模型对象,可以是任意的POJO对象mv.addObject(“message”, “Hello World”);//设置逻辑视图名,视图解析器会根据该名字解析到具体的视图页面mv.setViewName(“/WEB-INF/content/welcome.jsp”);return mv;}}  上面的logging来自commons.logging 1.2版本,其实无伤大雅,它可以在控制台用红字的形式打印信息,如果你想用专门的文件存储这些信息,我还是推荐log4j2.  单看这个方法本身,定义了一个ModelAndView,添加了内容,指明了跳转的jsp,你也可以这么写:return new ModelAndView(“/WEB-INF/content/welcome.jsp”, “message”, “Hello World”);  SpringMVC希望自己是严格地遵循MVC的精神被使用,即所有的JSP都放在web-inf中,避免你直接访问,你所有的请求都应该给控制器。  赞,挺好的。  关键是我现在出bug了,我的JSP如下:<%@ page contentType=”text/html;charset=UTF-8” language=”java” %><!DOCTYPE html PUBLIC “-//W3C//DTD HTML 4.-1 Transitional//EN” “http://www.w3.org/TR/html4/loose.dtd">${requestScope.message}  按理来说它应该显示的是hello world,但其实是原封不动地把${requestScope.message}这条语句打印了出来。  我试了下在这个类增加一个叫message的成员变量、注释掉上面的系统bean,其实都没用,真正问题在于jsp本身,它不识别这种${}表达式——EL表达式,解决办法是在jsp顶端加一条:<%@ page isELIgnored=”false” %>  即可解决问题。  基于注解的控制器:  现在基本都是用注解了吧,我写一个类如下:@Controllerpublic class WorldController {private static final Log logger = LogFactory.getLog(WorldController.class);@RequestMapping(value = “/world”)public ModelAndView hello(){logger.info(this.getClass() + “的hello方法被调用”);return new ModelAndView(“/WEB-INF/content/welcome.jsp”, “message”, “GoodNight World”);}}  这个类不用继承接口,更干净。通过对于方法的注解指明要拦截的URL,好用。  不过还要修改一下SpringMVC的配置文件<?xml version=”1.0” encoding=”UTF-8”?>


  有几个模版添加到顶端,然后添加自动扫描的配置,这里的base-package很重要。然后把 基于配置式的那3个bean的前2个注释掉,让Spring自由选择。这样部署应用,配置式和注解式会同时生效;不注释掉则无法使用注解式的controller,因为前2个bean不同。  如果是注解式,这三个bean应该为  第一个查找bean,第二个查找相应方法,第三个返回视图(与配置式相同)。  启用这三个,而注释掉下面的,会导致配置式的controller无法工作,404.  如果一行注释都不加,那么也同时都可以工作,效果如下:  晚安!  睡前,复习一下,基于注解的SpringAOP的自动扫描要怎么做1,配置web.xml:org.springframework.web.context.ContextLoaderListener2,Spring的根配置文件,启用@Aspect支持<?xml version=”1.0” encoding=”UTF-8”?>
3,记得添加自动扫描的配置信息,base-package同样十分重要。MeasureMeasure