Spring MVC使用配置
1、 创建项目文件夹,从spring官方网站http://spring.io/下载jar包,放到项目下面的WEB-INF/lib文件夹下面
2、 在WEB-INF/web.xml文件中,配置spring的servlet
3、 在eclipse中创建一个java project,创建一个类,
1) 一个服务端Action用注解@Controller表示
2) url用注解@RequestMapping表示
3) 请求需要执行的方法用注解@RequestMapping表示
4) 在执行的方法的参数中,加参数用以接收客户端传来的输入
5) 在执行的方法的参数中,用Model对象准备输出的值
6) Return 的字符串,是准备用来作为输出的视图的文件名,比如result.jsp
将编译好的class文件,发布到WEB-INF/classes目录下面
其他可用的注解还有:
有用于声明bean的Annotation:
@Component
@Controller(建议使用)
@Repository(建议使用)
@Service(建议使用)
有用于注入bean的Annotation:
@Autowired
@Qualifier
@Required
@Resource(建议使用)这是对jsr-250标准的实现
4、 写spring的配置文件,让spring的servlet找到我们的Action
5、 编写视图jsp文件
6、 发布项目后,在地址栏中测试
7、 Spring MVC工作原理
①当用户在浏览器中点击一个链接或者提交一个表单时,那么就会产生一个请求(request)。当请求离开浏览器时,它会携带用户请求的信息(比如说请求的URL信息,用户名,密码什么的)。
②请求的第一站到达的是Spring的DispatcherServlet,它是一个前端控制器,工作是将用户的请求委托给其他的组件(这里是交给Spring MVC的控制器)去处理。这里DispatcherServlet要决定将请求传给哪一个控制器(Controller)去处理,那么这时就需要处理器映射(HandlerMapping)了。处理器映射会看请求的URL信息,然后决定将请求交给哪一个控制器去处理。比如说有两个控制器ControllerA和ControllerB,分别处理url为a.do和b.do的请求,那么当请求者的url为a.do时,那么DispatcherServlet就将请求交给ControllerA进行处理。这个控制器就是我们开发人员写的了。
③当选择了一个合适的控制器后,DispatcherServlet就会根据控制器指定的方法里面的参数名称,从request对象中读取客户端传来的参数,然后调用这个方法。这时就进入我们的代码段了。我们在这里拿到了客户端提交来的数据,进行处理,比如对数据库的增删改操作。当然这些操作我们可以交给另外的service去处理,以方便做事务处理。
④我们的控制器对用户请求所携带的信息进行处理(或交给模型层处理)后,经常会产生一些其他的需要返回给浏览器进行显示的数据。这些原始数据直接显示出来显然是不友好的,那么就需要视图(View)来对这些数据进行显示了。控制器的最后一件事就是将模型数据打包,并且指定产生输出的视图的特定名称,然后它将模型(我们用Model对象)、视图名称发送给DispatcherServlet。所以控制器并没有与视图进行耦合,因为传递给DispatcherServlet的视图名称并不是某一个指定的特殊的文件名称(如后缀名一定是JSP或其他什么名称),它只要是一个可以产生输出和展示结果的逻辑名称就可以了。
⑤DispatcherServlet会向一个视图解析器(ViewResolver)进行请求,视图解析器可以将逻辑视图名称映射到一个特定的视图显示文件上面。
⑥现在DispatcherServlet知道哪一个视图文件可以显示结果了。该视图将会利用模板数据产生输出,这些输出通过response对象返回给客户端进行显示。
8、 Spring MVC与struts的区别
Spring MVC PK Struts2
1. 我们用struts2时采用的传统的配置文件的方式,并没有使用传说中的0配置。spring3 mvc可以认为已经100%零配置了(除了配置spring mvc-servlet.xml外)。
2. 机制:spring mvc的入口是servlet,而struts2是filter(这里要指出,filter和servlet是不同的。以前认为filter是servlet的一种特殊),这样就导致了二者的机制不同,这里就牵涉到servlet和filter的区别了。
3. Spring的Controller是默认Singleton的,或者是线程不安全的
和Struts1一样,Spring的Controller是默认Singleton的,这意味着每个request过来,系统都会用原有的instance去处理,这样导致了两个结果:我们不用每次创建Controller,减少了对象创建和垃圾收集的时间;由于只有一个Controller的instance,当多个线程调用它的时候,它里面的instance变量不是线程安全的。
而Struts2是线程安全的。
不过Spring提供注解@Scope指定作用域,所以做了@Scope("request")指定后,其实这个缺点是不存在的不存在的!这么说,其实Spring更加灵活。
4. spring mvc是基于方法的设计,而sturts是基于类。性能:spring会稍微比struts快。每次发一次请求都会实例一个action,每个action都会被注入属性,而spring基于方法,粒度更细,但要小心把握像在servlet控制数据一样。spring3 mvc是方法级别的拦截,拦截到方法后根据参数上的注解,把request数据注入进去,在spring3 mvc中,一个方法对应一个request上下文。而struts2框架是类级别的拦截,每次来了请求就创建一个Action,然后调用setter getter方法把request中的数据注入;struts2实际上是通过setter getter方法与request打交道的;struts2中,一个Action对象对应一个request上下文。
5. 参数传递:struts是在接受参数的时候,可以用属性来接受参数,这就说明参数是让多个方法共享的。
6. 设计思想上:struts更加符合oop的编程思想, spring就比较谨慎,在servlet上扩展。
7. intercepter的实现机制:struts有以自己的interceptor机制,spring mvc用的是独立的AOP方式。这样导致struts的配置文件量还是比spring mvc大,虽然struts的配置能继承,所以我觉得论使用上来讲,spring mvc使用更加简洁,开发效率Spring MVC确实比struts2高。spring mvc是方法级别的拦截,一个方法对应一个request上下文,而方法同时又跟一个url对应,所以说从架构本身上spring3 mvc就容易实现restful url。struts2是类级别的拦截,一个类对应一个request上下文;实现restful url要费劲,因为struts2 action的一个方法可以对应一个url;而其类属性却被所有方法共享,这也就无法用注解或其他方式标识其所属方法了。spring3 mvc的方法之间基本上独立的,独享request response数据,请求数据通过参数获取,处理结果通过ModelMap交回给框架方法之间不共享变量,而struts2搞的就比较乱,虽然方法之间也是独立的,但其所有Action变量是共享的,这不会影响程序运行,却给我们编码,读程序时带来麻烦。
注意:struts2与spring mvc都能很方便地返回json字符串,这一点并没有区别!
以下无正文
北大天池牛人教育中心 月薪10-15K,java软件开发,理工科背景