`

Spring_MVC(3)表单页面处理

阅读更多
  1.   
  2.         // 跳转到用户信息页面   
  3.         return "account/profile";   
  4.     }   
  5. }  
/**
 * 2010-1-26
 */
package org.zlex.spring.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam; 
import org.zlex.spring.domain.Account;
import org.zlex.spring.service.AccountService;

/**
 * 账户信息控制器
 * 
 * @author <a href="mailto:zlex.dongliang@gmail.com">梁栋</a>
 * @version 1.0
 * @since 1.0
 */
@Controller
@RequestMapping(value = "/profile.do")
public class ProfileController {
	@Autowired
	private AccountService accountService;

	/**
	 * 账户信息展示
	 * 
	 * @param id
	 * @param model
	 * @return
	 */
	@RequestMapping(method = RequestMethod.GET)
	public String profile(@RequestParam("id") int id, ModelMap model) {
		Account account = accountService.read(id);
		model.addAttribute("account", account);

		// 跳转到用户信息页面
		return "account/profile";
	}
}


@RequestMapping(value = "/profile.do")为该控制器绑定url(/profile.do)
@RequestMapping(method = RequestMethod.GET)指定为GET请求
model.addAttribute("account", account);绑定账户
return "account/profile";跳转到“/WEB-INF/page/account/porfile.jsp”页面
对应构建这个页面:
porfile.jsp

Jsp代码 复制代码
  1. <fieldset><legend>用户信息</legend>   
  2. <ul>   
  3.     <li><label>用户名:</label><c:out value="${account.username}" /></li>   
  4. </ul>   
  5. </fieldset>  
<fieldset><legend>用户信息</legend>
<ul>
	<li><label>用户名:</label><c:out value="${account.username}" /></li>
</ul>
</fieldset>


账户信息已经绑定在response的属性上。自然,使用<c:out />标签就可以获得账户信息内容。
访问地址http://localhost:8080/spring/profile.do?id=1,结果如图所示:

接着构建一个登录控制器LoginController
LoginController.java

Java代码 复制代码
  1. /**  
  2.  * 2010-1-25  
  3.  */  
  4. package org.zlex.spring.controller;   
  5.   
  6. import org.springframework.beans.factory.annotation.Autowired;   
  7. import org.springframework.stereotype.Controller;   
  8. import org.springframework.ui.ModelMap;   
  9. import org.springframework.web.bind.annotation.ModelAttribute;   
  10. import org.springframework.web.bind.annotation.RequestMapping;   
  11. import org.springframework.web.bind.annotation.RequestMethod;   
  12. import org.zlex.spring.domain.Account;   
  13. import org.zlex.spring.service.AccountService;   
  14.   
  15. /**  
  16.  * 登录控制器  
  17.  *   
  18.  * @author <a href="mailto:zlex.dongliang@gmail.com">梁栋</a>  
  19.  * @version 1.0  
  20.  * @since 1.0  
  21.  */  
  22. @Controller  
  23. @RequestMapping(value = "/login.do")   
  24. public class LoginController {   
  25.   
  26.     @Autowired  
  27.     private AccountService accountService;   
  28.   
  29.     /**  
  30.      * 初始化表单  
  31.      *   
  32.      * @param model  
  33.      * @return  
  34.      */  
  35.     @RequestMapping(method = RequestMethod.GET)   
  36.     public String initForm(ModelMap model) {   
  37.         Account account = new Account();   
  38.         model.addAttribute("account", account);   
  39.         // 直接跳转到登录页面   
  40.         return "account/login";   
  41.     }   
  42.   
  43.     /**  
  44.      * 登录  
  45.      *   
  46.      * @param account  
  47.      * @return  
  48.      */  
  49.     @RequestMapping(method = RequestMethod.POST)   
  50.     public String login(@ModelAttribute("account") Account account) {   
  51.         Account acc = accountService.read(account.getUsername(), account   
  52.                 .getPassword());   
  53.         if (acc != null) {   
  54.             return "redirect:profile.do?id=" + acc.getId();   
  55.         } else {   
  56.             return "redirect:login.do";   
  57.         }   
  58.     }   
  59. }  
/**
 * 2010-1-25
 */
package org.zlex.spring.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.zlex.spring.domain.Account;
import org.zlex.spring.service.AccountService;

/**
 * 登录控制器
 * 
 * @author <a href="mailto:zlex.dongliang@gmail.com">梁栋</a>
 * @version 1.0
 * @since 1.0
 */
@Controller
@RequestMapping(value = "/login.do")
public class LoginController {

	@Autowired
	private AccountService accountService;

	/**
	 * 初始化表单
	 * 
	 * @param model
	 * @return
	 */
	@RequestMapping(method = RequestMethod.GET)
	public String initForm(ModelMap model) {
		Account account = new Account();
		model.addAttribute("account", account);
		// 直接跳转到登录页面
		return "account/login";
	}

	/**
	 * 登录
	 * 
	 * @param account
	 * @return
	 */
	@RequestMapping(method = RequestMethod.POST)
	public String login(@ModelAttribute("account") Account account) {
		Account acc = accountService.read(account.getUsername(), account
				.getPassword());
		if (acc != null) {
			return "redirect:profile.do?id=" + acc.getId();
		} else {
			return "redirect:login.do";
		}
	}
}


分段详述,先说初始化表单:

Java代码 复制代码
  1. /**  
  2.  * 初始化表单  
  3.  *   
  4.  * @param model  
  5.  * @return  
  6.  */  
  7. @RequestMapping(method = RequestMethod.GET)   
  8. public String initForm(ModelMap model) {   
  9.     Account account = new Account();   
  10.     model.addAttribute("account", account);   
  11.     // 直接跳转到登录页面   
  12.     return "account/login";   
  13. }  
	/**
	 * 初始化表单
	 * 
	 * @param model
	 * @return
	 */
	@RequestMapping(method = RequestMethod.GET)
	public String initForm(ModelMap model) {
		Account account = new Account();
		model.addAttribute("account", account);
		// 直接跳转到登录页面
		return "account/login";
	}


@RequestMapping(method = RequestMethod.GET)指定了GET请求方式,这与POST表单提交相对应!
model.addAttribute("account", account);绑定账户对象,也就是这个登录表单对象
return "account/login";指向登录页面
再看登录方法:

Java代码 复制代码
  1. /**  
  2.  * 登录  
  3.  *   
  4.  * @param account  
  5.  * @return  
  6.  */  
  7. @RequestMapping(method = RequestMethod.POST)   
  8. public String login(@ModelAttribute("account") Account account) {   
  9.     Account acc = accountService.read(account.getUsername(), account   
  10.             .getPassword());   
  11.     if (acc != null) {   
  12.         return "redirect:profile.do?id=" + acc.getId();   
  13.     } else {   
  14.         return "redirect:login.do";   
  15.     }   
  16. }  
	/**
	 * 登录
	 * 
	 * @param account
	 * @return
	 */
	@RequestMapping(method = RequestMethod.POST)
	public String login(@ModelAttribute("account") Account account) {
		Account acc = accountService.read(account.getUsername(), account
				.getPassword());
		if (acc != null) {
			return "redirect:profile.do?id=" + acc.getId();
		} else {
			return "redirect:login.do";
		}
	}


@RequestMapping(method = RequestMethod.POST)绑定POST表单提交请求
@ModelAttribute("account") Account account绑定表单对象。
最后,再来看看页面:
login.jsp

Jsp代码 复制代码
  1. <fieldset><legend>登录</legend><form:form commandName="account">   
  2.     <form:hidden path="id" />   
  3.     <ul>   
  4.         <li><form:label path="username">用户名:</form:label><form:input   
  5.             path="username" /></li>   
  6.         <li><form:label path="password">密码:</form:label><form:password   
  7.             path="password" /></li>   
  8.         <li>   
  9.         <button type="submit">登录</button>   
  10.         <button type="reset">重置</button>   
  11.         </li>   
  12.     </ul>   
  13. </form:form></fieldset>  
<fieldset><legend>登录</legend><form:form commandName="account">
	<form:hidden path="id" />
	<ul>
		<li><form:label path="username">用户名:</form:label><form:input
			path="username" /></li>
		<li><form:label path="password">密码:</form:label><form:password
			path="password" /></li>
		<li>
		<button type="submit">登录</button>
		<button type="reset">重置</button>
		</li>
	</ul>
</form:form></fieldset>


注意,<form:form commandName="account">必须指明commandName,且与表单初始化、提交方法中的表单对象名称保持一致!
页面目录结构如下图所示:

在页面中,我加入了一部分css效果,这部分代码我就不在这里唠叨了,大家可以看源码!
登录试试,如图:

用户名:snwolf 密码:zlex
如果登录成功,我们就会跳转到之前的账户信息页面!
注解的确减少了代码的开发量,当然,这对于我们理解程序是一种挑战!如果你不知道原有的SpringMVC的流程,很难一开始就能摆弄清楚这些内容!

分享到:
评论
2 楼 liutao1600 2013-05-08  
太好了,每天学习你的文章~~~
1 楼 phoenix_sun 2010-09-09  
此部分让我纠结了很久,不能搞清楚,谢谢您的讲解

相关推荐

    spring_mvc代码_spring_mvc代码实例_

    10. **Form标签与数据绑定**:Spring MVC 提供了表单标签库,支持数据绑定和验证,如`&lt;form:input&gt;`标签用于输入字段,`&lt;form:errors&gt;`显示错误信息。 11. **转换器与格式化器**:`@InitBinder` 可以注册自定义的...

    精通Spring_Web_MVC优秀框架.pdf

    - **表单标签**:Spring Web MVC提供了一套强大的表单标签库,可以帮助开发者更轻松地创建HTML表单元素。 通过上述内容的学习,可以全面掌握Spring Web MVC框架的核心开发知识,为构建高质量的Web应用程序打下坚实...

    Spring_MVC_实战教程

    表单的`action`属性指向`login.do`,这是Spring MVC处理的URL路径。 - **Servlet配置**:在`web.xml`中配置`DispatcherServlet`,并设置`contextConfigLocation`来指定Spring配置文件的位置。 - **请求映射**:...

    spring_mvc2

    10. **数据绑定**:Spring MVC支持自动将请求参数绑定到控制器方法的参数,以及将模型数据绑定到表单。 11. **异常处理**:通过`@ExceptionHandler`注解,可以在控制器内处理特定的异常,或者全局地使用`@...

    spring-mvc-jquery.zip_jquery_mvc jquery_spring jquery_spring mvc

    开发者可能使用jQuery来处理用户的输入,通过AJAX调用Spring MVC的Controller方法来异步获取或更新数据,而无需刷新整个页面。这种方式提高了应用的响应速度,提供了更好的用户体验。 在实际应用中,jQuery可以与...

    我学spring_mvc_01

    在实际开发中,我们还需要了解Spring MVC的其他特性,如拦截器(Interceptor)、异常处理、局部变量和模型数据传递、上传下载支持等。同时,结合源码阅读,可以帮助我们更好地理解其内部机制。 总的来说,"我学...

    spring_mvc_jar.zip

    Spring MVC 是一款强大的Java Web开发框架,它是Spring框架的一部分,用于构建可维护、高性能的Web应用程序。这个"spring_mvc_jar.zip"压缩包包含了运行Spring MVC应用所需的库文件,通常在搭建Spring MVC环境或者...

    Spring_MVC详解学习

    Spring MVC框架的核心组件包括控制器(Controller)、模型对象(Model)、分派器(Dispatcher)和处理程序对象(Handler)。控制器负责接收用户的请求并进行处理,模型对象代表数据和业务逻辑,分派器负责将请求分发...

    深入浅出学Spring_Web_MVC

    11. **表单标签**:了解Spring Web MVC提供的JSP标签库。 #### 四、总结 Spring Web MVC 是一个功能强大且灵活的Web框架,它不仅能够帮助开发者构建高质量的Web应用程序,还能够与其他Spring生态系统中的组件无缝...

    spring_mvc学习笔记

    Spring MVC允许通过@ControllerAdvice和@ExceptionHandler注解进行全局异常处理,可以统一处理应用程序中出现的异常,提高代码的健壮性。 9. **数据绑定与验证**: Spring MVC支持自动的数据绑定,可以从请求参数...

    spring_mvc_webflow案例

    在Spring MVC中,WebFlow定义了一种声明式的方式来处理Web应用程序中的流程逻辑。相比于传统的控制器方法,WebFlow允许开发者定义一系列状态(states)和转换(transitions),每个状态对应一个视图,而转换则是状态...

    最全最经典spring-mvc教程

    错误处理和异常处理也是Spring MVC中的重要部分,通过@ControllerAdvice和@ExceptionHandler可以全局处理异常,提供统一的错误页面。 最后,测试是任何应用程序开发的重要环节。Spring MVC提供了MockMVC,可以在不...

    spring_MVC中文教程pdf

    Spring框架提供了数据绑定机制,能够将客户端提交的表单数据绑定到后端处理的对象上。 8. 异常处理: Spring框架提供了一套丰富的异常处理机制,使得在开发过程中可以更好地管理和处理各种运行时异常,提高程序的...

    最全最经典spring_mvc教程

    3. **处理请求**: Handler处理请求,执行相应的业务逻辑,并返回ModelAndView对象。 4. **选择ViewResolver**: DispatcherServlet根据ModelAndView中的View名称选择合适的ViewResolver。 5. **渲染视图**: ...

    spring_mvc(一)环境搭建

    随着你对Spring MVC的理解加深,可以进一步学习如何使用Model、View和Controller进行交互,处理表单数据,使用拦截器、AOP、异常处理等高级特性。在实际开发中,Spring MVC与Spring Boot的结合使用能带来更多的便利...

    Spring_MVC_3.0实战指南

    - **与数据转换、格式化、验证框架无缝集成**:Spring MVC 3.0 可以更好地与 Spring 的数据绑定、转换和验证机制集成,提供了更加强大和灵活的数据处理能力。 - **对静态资源处理提供特殊支持**:Spring MVC 3.0 对...

    夏昕老师spring _mvc的例子原代码part3

    描述中提到的“夏老师《spring开发指南0.8》”是一本关于Spring框架的教程书籍,版本为0.8,暗示我们可能在处理一个基于早期Spring MVC版本的项目。这个例子是用户注册功能的实现,这意味着我们将接触到如何在Spring...

    itheima_spring_mvc.zip

    此外,Spring MVC还提供了数据绑定、表单验证、模型属性转换等功能。数据绑定允许我们将HTTP请求参数自动绑定到控制器方法的参数上。表单验证则可以通过JSR-303/JSR-349 Bean Validation实现,为模型对象添加校验...

    夏昕老师spring _mvc的例子原代码part2

    通过这个压缩包,学习者可以了解到Spring MVC的基本结构和工作原理,包括控制器的定义、模型数据的处理、视图的渲染,以及Spring MVC如何与Servlet容器协同工作。具体步骤可能包括创建一个处理登录请求的Controller...

    Spring_MVC详解学习.pdf

    Spring MVC是一个基于Java的实现了MVC设计模式的请求驱动类型的轻量级Web框架,通过DispatcherServlet来协调各个组件以完成请求处理和响应的工作。Spring框架提供了构建Web应用程序的全功能MVC模块,支持可插入的MVC...

Global site tag (gtag.js) - Google Analytics