Spring FORM 标签库
Spring MVC 提供了一个 JSP 标签库(Spring Form),使将表单元素绑定到 Model 数据变得更加容易。Spring Framework 提供了一些标签,用于显示 错误,设置主题和输出国际化消息。
使用 Spring Form 标签库的语法
需要在 jsp 文件头部加上:
<%@taglib uri="http://www.springframework.org/tags/form" prefix="form">
本示例中使用的表单标签
- 呈现 HTML“form”标签,并向内部标签公开绑定路径以进行绑定。
- 使用绑定值呈现类型为“text”的 HTML“input”标记。
- 在 HTML’span’ 标签中呈现字段错误。
- 使用绑定值呈现类型为“password”的 HTML“input”标签。
- 呈现类型为“radio”的 HTML“input”标签。
- 呈现 HTML“select”元素。支持数据绑定到所选选项。
- 呈现单个 HTML“option”。根据绑定值适当设置“selected”。
- 呈现 HTML“textarea”。
- 呈现类型为“checkbox”的 HTML“input”标签。
简单注册表单示例
1. 修改 web.xml 以配置 Dispatcher Servlet。
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>*.html</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
- 创建一个 dispatcher-servlet.xml 文件,其中包含所有用于处理用户请求的配置 bean,它处理用户请求并将其分派到各个控制器。
dispatcher-servlet.xml
<?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:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
<bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"/>
<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="urlMap">
<map>
<entry key="/index.html">
<ref bean="registrationController"/>
</entry>
</map>
</property>
</bean>
<bean id="registrationValidator" class="registrationValidator"/>
<bean id="registrationController" class="RegistrationFormController">
<property name="sessionForm"><value>false</value></property>
<property name="commandName" value="registration"></property>
<property name="commandClass" value="Registration"></property>
<property name="validator"><ref bean="registrationValidator"/></property>
<property name="formView"><value>index</value></property>
<property name="successView"><value>success</value></property>
</bean>
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basename" value="messages"/>
</bean>
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver"
p:prefix="/WEB-INF/jsp/"
p:suffix=".jsp" />
</beans>
3. 创建一个 Jsp 文件以从用户 index.jsp 接收输入,该文件包含带有 Spring Form 标签的所有表单字段。
index.jsp
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Welcome to Spring Web MVC project</title>
</head>
<body bgcolor="DDDDDD">
<h1>Spring Form tags Example</h1>
<form:form commandName="registration" method="POST">
User Name: <form:input path="username"/><font color="red">
<form:errors path="username"/></font><br />
Password: <form:password path="password"/><font color="red">
<form:errors path="password"/></font><br />
First Name: <form:input path="fname"/><br />
Last Name: <form:input path="lname"/><br />
Gender: <form:radiobutton path="gender" value="male"/>Male
<form:radiobutton path="gender" value="female"/>Female<br />
Country :<form:select path="country" >
<form:option value="india">India</form:option>
<form:option value="india">USA</form:option>
<form:option value="india">Australia</form:option>
</form:select><br />
Address: <form:textarea path="addr"/><br />
Select any :<form:checkbox path="cb" value="checkbox1"/>
Check Box1
<form:checkbox path="cb" value="checkbox2"/>
Check Box2<br />
<input type="submit" value="submit"/>
</form:form>
</body>
</html>
4. 创建另一个 Jsp 文件 success.jsp,它是用于显示输出的 Spring 视图。在此文件中,我们使用表达式语言来显示详细信息。
success.jsp
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@page import="java.util.Enumeration"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Spring Form Tags Example</title>
</head>
<body bgcolor="DDDDDD">
<h1>Spring Form tags examples</h1>
<h2>
User Name: ${uname}<br />
First Name: ${fname}<br />
Last Name: ${lname}<br />
Gender: ${gender}<br />
Country: ${country}<br />
Address: ${addr}<br />
Selected Check box: ${cb}
</h2>
</body>
</html>
5. 创建一个 Java 类文件 Registration.java,其中包含注册应用程序的业务逻辑。在这里,此文件包含 8 个私有变量,它们分别具有 getter 和 setter 方法,用于存储注册细节。
Registration.java
public class Registration {
private String username;
private String password;
private String fname;
private String lname;
private String gender;
private String country;
private String addr;
private String cb;
public String getAddr() {return addr;}
public void setAddr(String addr) {this.addr = addr;}
public String getCb() {return cb;}
public void setCb(String cb) {this.cb = cb;}
public String getCountry() {return country;}
public void setCountry(String country) {this.country = country;}
public String getGender() {return gender;}
public void setGender(String gender) {this.gender = gender;}
public Registration() {}
public String getFname() {return fname;}
public void setFname(String fname) {this.fname = fname;}
public String getLname() {return lname;}
public void setLname(String lname) {this.lname = lname;}
public String getPassword() {return password;}
public void setPassword(String password) {this.password = password;}
public String getUsername() {return username;}
public void setUsername(String username) {this.username = username;}
}
6. 创建一个 RegistrationFormController.java 文件,该文件扩展了 SimpleFormController 以控制用户请求并返回相应的 ModelAndView 对象。
RegistrationFormController.java
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.SimpleFormController;
public class RegistrationFormController extends SimpleFormController {
@Override
protected ModelAndView onSubmit(Object command) throws Exception {Registration reg=(Registration)command;
String uname=reg.getUsername();
String fname=reg.getFname();
String lname=reg.getLname();
String gender=reg.getGender();
String country=reg.getCountry();
String cb=reg.getCb();
String addr=reg.getAddr();
ModelAndView mv = new ModelAndView(getSuccessView());
mv.addObject("uname",uname);
mv.addObject("fname",fname);
mv.addObject("lname",lname);
mv.addObject("gender",gender);
mv.addObject("country",country);
mv.addObject("cb",cb);
mv.addObject("addr",addr);
return mv;
}
}
7,创建一个 registrationValidator.java 文件来验证诸如用户名和密码之类的表单字段不能为空.DispatcherServlet 负责赋予属性以将 Validator 添加到用户请求并执行验证。
registrationValidator.java
import org.springframework.validation.Errors;
import org.springframework.validation.Validator;
public class registrationValidator implements Validator
{public boolean supports(Class cl) {return Registration.class.isAssignableFrom(cl);
}
public void validate(Object ob, Errors errors) {Registration reg=(Registration)ob;
if (reg.getUsername() == null || reg.getUsername().length() == 0) {errors.rejectValue("username", "error.empty.username");
}
else if (reg.getPassword() == null || reg.getPassword().length() == 0) {errors.rejectValue("password", "error.empty.password");
}
}
}
8,创建或修改 messages.properties 文件,其中包含各自键值的消息,在此文件中,我们为两个键值编写消息,分别为空用户名和空密码。
messages.properties
error.empty.username=Please Enter User name
error.empty.password=Please Enter Password
9,构建并运行应用程序
输出
访问页面:http://localhost:8080/Registration/index.html
清空密码时,使用 spring 错误标签显示相应的错误消息。
只有在正确验证用户名和密码后,我们才能提交表单。
显示输出,其中包含所有提交注册的值