您的位置:首页 > 编程语言 > Java开发

Spring2.5基于驱动的MVC

2009-08-10 18:49 471 查看
一.Web.xml
的配置
<!--

Spring

服务层的配置文件,

它将会加载spring

文件夹下的所有spring

的配置文件-->

<context-param>

<param-name>contextConfigLocation</param-name>

<param-value>classpath*: spring/*.xml</param-value>

</context-param>

<!--

Spring

容器启动监听器 -->

<listener>

<listener-class>org.springframework.web.context.ContextLoaderListener

</listener-class>

</listener>

<!--

Spring MVC

的Servlet

,它将加载WEB-INF/annomvc-servlet.xml

的

配置文件,以启动Spring MVC

模块-->

<servlet>

<servlet-name>annomvc</servlet-name>

<servlet-class>org.springframework.web.servlet.DispatcherServlet

</servlet-class>

<load-on-startup>2</load-on-startup>

</servlet>

<servlet-mapping>

<servlet-name>annomvc</servlet-name>

<url-pattern>*.do</url-pattern>

</servlet-mapping>

二.

annomvc-servlet.xml

的配置:

<!-- ①

:对web

包中的所有类进行扫描,以完成Bean

创建和自动依赖注入的功能 -->

<context:component-scan base-package="

指定的Controller

类存放的包的路径"/>

<!-- ②

:启动Spring MVC

的注解功能,完成请求和注解POJO

的映射 -->

<bean class="org.springframework.web.servlet.mvc.annotation.

AnnotationMethodHandlerAdapter"/>

<!--

③

:对模型视图名称的解析,即在模型视图名称添加前后缀,会自动到/WEB-INF/jsp/

路径下面加载.jsp

的文件 -->

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"

p:prefix="/WEB-INF/jsp/" p:suffix=".jsp"/>

三.

然后在你的控制类名称前面加上@Controller

表明这个普通的类是起到控制跳转的类,

在用@RequestMapping

(”

请求的路径”

)来制定你前台调用此方法的url,@RequestMapping

可以加在一个方法的前面,表明只有这个方法受此路径的控制,如果加在一个类的前面表明此类的所有方法都受这个路径的控制。

四.一个 Controller

对应一个 URL

,由请求参数决定请求处理方法

:

通过注解我们可以实现指定一个url,

去调用一个大类里的不同的方法,具体的实现是 在一个类的前面用@RequestMapping

(“URL

“)指定一个访问路径,然后在你调用的此类的不同的方法的前面通过@RequestMapping

(params=”

调用此方法的标志如:method=delete”

)来调用具体的方法,在@RequestMapping

里还有一个属性method

可以用来指定你是用get

还是用post

调用请求这个方法的,如:(

method = RequestMethod.POST

表明只有post

请求才能调用此方法)。

五.处理方法入参如何绑定 URL

参数

:spring

在调用处理方法时如何给指定的方法传入参数,其实spring

在给方法传入参数,和处理好后跳转到指定的视图存在一套潜在的规则,例如我们在调用public String

addUer(String username,int id){return

“视图名称“}

时,前台视图对应的属性的名称的值就会传入到此方法对应的属性上,需要注意的是我们视图上属性的名称和方法里视图的名称一定要一直,而且对于像int,long,

等这样的基本的数据类型其前台一定要有值传过来,不然就会抛出 TypeMismatchException

异常,提示无法将 null

转换为基本数据类型,另外请求处理方法的入参还可以是一个封装为具体对象的javaBean

,此时从前台传过来的数据会自动的绑定到JavaBean

里相应的属性的上面,而且像int,long,

等这样的基本数据类型可以为空,spring

会自动的将其转换为0

,如果对象里有级联的属性,还可以把值付级联对象的属性上面。如果我们不想让前面的属性一定要和方法里的属性想对应,而且不一定非要传值过来,我们可以通过

@RequestParam

注解实现,例如:

public String listBoardTopic(@RequestParam(value="id",

required=false

) int topicId,User user)

,此时前台传过来的id

的值就会付到topicId

的上面,而且当属性required=false

时表示前台可以不传值过来,当等于true

的时候,前台对应的属性一定要传值过来,否则报错。

六.如何让方法里的得到的数据传入到指定的页面:spring2.0

以上的版本给我们提供了org.springframework.ui.ModelMap

类,它作为通用的模型数据承载对象,传递数据供视图所用。我们可以在请求处理方法中声明一个 ModelMap

类型的入参,在方法里通过.addattribute()

方法把值加入到一个变量里面,然后在制定的页面就可以通过request

的请求道指定的制定的值,通过一个例子来详细说明ModelMap

的具体使用规则

@SessionAttributes("currUser")

(1

)

public String listBoardTopic(@RequestParam("id")int topicId,

User user,ModelMap model

(2

)

) {

bbtForumService.getBoardTopics(topicId);

model.addAttribute("currUser",user);

(3

)

return "listTopic";


我们在2处提供了一个ModelMap类型的入参,在3处把要传到视图上的值封装到一个字符串里,这样我们在制定的视图页面就可以取得到user对象里的值,ModelMap传值的默认的范围是request级别的,也就是说只能在制定的视图里可以看到,在下一个视图里就无法取得,为此我们可以通过@SessionAttributes注解把指定的值的范围指定为Session级别的,这样我们可以在一次请求的所有的页面都可以访问到此值,如1处那样。其实 @SessionAttributes允许指定多个属性。你可以通过字符串数组的方式指定多个属性,如 @SessionAttributes({“attr1”,”attr2”})。此外,@SessionAttributes还可以通过属性类型指定要 session化的 ModelMap属性,如 @SessionAttributes(types = User.class),当然也可以指定多个类,如 @SessionAttributes(types = {User.class,Dept.class}),还可以联合使用属性名和属性类型指定:@SessionAttributes(types = {User.class,Dept.class},value={“attr1”,”attr2”})。我们还可以通过@ModelAttribute()注解把ModelMap里的值绑定到入参里面,传入到下一个方法里使用。

七.方法返回的参数:

当返回时void的时候,对应的视图寻找路径是你请求的url路径;当返回的是String类型的时候,对应的视图寻找路径是你返回的字符串;当返回的是ModelMap的时候,对应的视图路径是你请求的URL路径,此时返回的ModelMap里包含的数据作为视图显示的数据模型。

八.注册自己的属性编辑器:

Spring MVC允许向整个 Spring框架注册属性编辑器,它们对所有 Controller都有影响。当然 Spring MVC也允许仅向某个 Controller注册属性编辑器,对其它的 Controller没有影响。前者可以通过 AnnotationMethodHandlerAdapter的配置做到,而后者则可以通过 @InitBinder注解实现。

(1)对所有的Controller都有影响的属性编辑器实现方式:

<bean class="org.springframework.web.servlet.mvc.annotation.

AnnotationMethodHandlerAdapter">

<property name="webBindingInitializer">

<bean class="com.baobaotao.web.MyBindingInitializer"/>

</property>

</bean>

实现具体的方法:

public class MyBindingInitializer implements WebBindingInitializer {


public void initBinder(WebDataBinder binder, WebRequest request) {

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");

dateFormat.setLenient(false);//关闭时间宽松的模式

binder.registerCustomEditor(Date.class,

new CustomDateEditor(dateFormat, false));

binder.registerCustomEditor(String.class, new StringTrimmerEditor(false));

}

(2)如果希望某个属性编辑器仅作用于特定的 Controller,可以在 Controller中定义一个标注 @InitBinder注解的方法,可以在该方法中向 Controller了注册若干个属性编辑器

@Controller

public class MyFormController {

@InitBinder

public void initBinder(WebDataBinder binder) {

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");

dateFormat.setLenient(false);

binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, false));

}

(3)绑定二进制流文件解析器:

@InitBinderprotected
void

initBinder(HttpServletRequest request,ServletRequestDataBinder
binder)
throws

ServletException {binder.registerCustomEditor(
byte

[].
class

,
new
ByteArrayMultipartFileEditor());
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: