Spring入门学习之Spring MVC(part 2)

Spring MVC

MVC设计模式

       SpringMVC框架当然也是基于MVC设计模式的框架。MVC设计模式包含模型、视图、控制器三个模块。视图负责应用的显示(例如JSP/html),模型封装了应用的数据和业务逻辑,控制器负责接受用户的输入,改变模型,以及调整视图的显示。

       其中servlet或者filter都可以充当控制器。Spring MVC 和 Struts1使用一个Servlet作为控制器,而struts2使用一个filter作为控制器。模型使用POJO(plain old java object)。

一个JavaBean必须拥有一个无参构造器,并且通过get/set方法来访问参数,同时支持持久化。

 

Spring mvc

1.      Spring MVC的优点:

1)      若基于某个框架来开发一个基于MVC模式的应用,我们需要负责编写一个Dispatcher Servlet和控制器类。其中,Dispatcher servlet必须能做如下事情:

l  根据URI调用相应的action(即controller,控制器类,实现具体的业务逻辑)。

l  实例化正确的控制器类。

l  调用控制器对象的相应方法。

l  转向到一个视图(JSP页面)。

Spring MVC是一个包含了Dispatcher servlet的MVC框架。它调用控制器方法并转发视图。不用编写Dispatcher servlet是使用Spring MVC的第一个好处。

2)      Spring MVC中使用基于xml的配置文件。

3)      Spring MVC实例化控制器,并根据用户输入来构造bean。

4)      Spring MVC可以自动绑定用户输入,并正确地转换数据类型。

5)      Spring MVC内置了常用的校验器。

6)      Spring MVC是spring框架的一部分,可以利用Spring框架提供的其他能力。

7)      支持国际化和本地化,支持多种视图技术。

2.      Spring MVC开发使用

1)      Spring MVC内置Dispatcher Servlet的使用:

l  在web.xml中配置

l  Dispatcher Servlet初始化时会在WEB-INF下寻找对应命名为servletName-servlet.xml的配置文件,servletName为之前声明的Dispatcher servlet 的 name。当然也可以把Spring MVC的配置文件放在应用程序目录的任何地方,用servlet定义的init-param元素,以便Dispatcher servlet加载到该文件,例如:

 

<servlet>
  	<servlet-name>springmvc</servlet-name>
  	<servlet-class>
  		org.springframework.web.servlet.DispatcherServlet
  	</servlet-class>
  	<init-param>
  		<param-name>contextConfigLocation</param-name>
  		<param-value>/WEB-INF/personalBlog-config.xml</param-value>
  	</init-param>
  	<load-on-startup>1</load-on-startup>
</servlet>

 

2)      控制器开发(旧版,实现controller接口)

在Spring2.5版本前,开发控制器需要实现org.springframework.web.servlet.mvc.Controller接口。这个接口公开了一个handleRequest方法,该方法签名如下:

ModelAndView handleRequest(HttpServletRequest request,HttpServletResponse response)

开发完毕需在SpringMVC的bean配置文件中声明,如下:

<?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:util="http://www.springframework.org/schema/util" xsi:schemaLocation="  
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd  
        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"> <!-- bean definitions here --> 
	<bean name="/hello.action" class="controller.HelloController"></bean>
</beans>

将/hello.action映射到该控制器上。

3)      * View Resolver

通过在配置文件中定义视图解析器负责解析视图,这样view路径将缩短,仅需提供jsp文件名称即可完成页面跳转。SpringMVC-servlet.xml配置view resolver如下:

4)     基于注解的控制器

使用基于注解的控制器的优点:其一,一个控制器类可以处理多个动作(区别于实现Controller接口);其二,控制器的映射由RequestMapping注释处理,而不用在xml文件中配置。

基于注解的控制器使用方法:

a)      Spring使用扫描机制来找到应用程序中所有基于注解的控制器类。为了使Spring能够找到你的控制器,需要在Spring MVC的配置文件中做如下处理:

首先,在配置文件中声明Spring-context,如下:

<beans

       …

       xmlns : context=http://www.springframework.org/schema/context

       …

然后,需要应用<component-scan/>元素,如下:

<context: component-scan base-package=”basePackage(控制器所在包)”>

 

b)     编写请求方法:每个请求处理方法可以有多个不同类型的参数,以及一个多种类型的返回结果。下面是可以在请求处理方法中出现的参数类型:

l  javax.servlet.ServletRequest/ javax.servlet.http.HttpServletRequest

l  javax.servlet.ServletResponse/ javax.servlet.http.HttpServletResponse

l  …HttpSession

l  java.util.Locale

l  表单对象

l  带@PathVariable注释的对象

org.springframework.ui.Model类型, 每次调用请求处理方法时,Spring MVC都创建Model对象并将其Map注入到各种对象。

l  …

请求方法可以返回如下类型对象:

l  ModelAndView

l  Model

l  Map包含模型的属性

l  View

l  代表逻辑视图名的String

l  Void

l  …

 

c)      使用@Controller 和 @RequestMapping 标注处理方法,如下:

请求映射的值可以是一个空字符串,此方法被映射到如下网址:

http://localhost:8080/context,可以用该方法设置应用程序的默认访问页。如下:

 

	@RequestMapping(value="/")
	public String welcomePage(Model Model){
		
		return "welcome";
	}

5)      *重定向和Flash属性

转发跟重定向的区别:转发比重定向快,因为重定向经过客户端,而转发没有。若需要重定向到一个外部网站,则无法使用转发。另外,使用重定向可以避免在用户重新加载页面时再次调用同样的动作。使用重定向的一个不方便的地方是:无法轻松传值给目标页面。而采用转发,则可以简单地将属性添加到Model,使得目标视图可以轻松访问。由于重定向经过客户端,所以Model中的一切都在重定向时丢失。可以通过Flash属性提供一种供重定向传值的方法。

Flash使用方法:

a)      首先在Spring MVC配置文件中,需要有个<annotation-driven/>元素

b)     然后需要在方法上添加一个新的参数类型org.springframework.web.sevlet.mvc.support.RedirectAttributs,如下:

 

@RequestMapping(value="/saveAndUpdateBlog")
	public String saveAndUpdateBlog(@RequestParam int blogID, @ModelAttribute Blog blog, RedirectAttributes redirectAttributes){
		
		if(blogID == 0){
			blogMapper.save(blog);	
		}else{
			Map<String, Object> parm = new HashMap<>();
			parm.put("blogID", blogID);
			parm.put("blog", blog);
			blogMapper.update(parm);
		}			
		
		String tags = blog.getBlogTags();
		String[] tagList = tags.split("\\s+");
		
		/**返回前台结果**/
		Map<String, Object> responseParm = new HashMap<>();
		responseParm.put("blog", blog);
		responseParm.put("tagList", tagList);
		
		redirectAttributes.addFlashAttribute("responseParm",responseParm);
		
		return "redirect:/blog/" + blog.getBlogID();
	}

6)      *请求参数和路径变量 

请求参数获取方法:

http://localhost:8080/context/method?valuename=value

Spring MVC中可以使用@RequestParm注释类型来注释方法参数,如下:

Public void sendProduce(@RequesetParam int valuename)

而且@RequestParam注解的参数类型不一定是字符串

路径变量的获取方法:

http://localhost:8080/context/method/productID,获取produceID的值方法如下:

@RequestMapping(value=”/method/{productID}”)

Public String viewProduct(@PathVariable Long id, Modelmodel){
       ...
}

当有多个路径变量时可能会倒是解析错误,导致404错误,不过可以使用JSTL的<c:url value=””/>标签来解决。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值