Struts提供了国际化的功能,对于一个面向各国的系统来说,是非常有帮助的。只需要提供每个国家的语言资源包,配置后即可使用。
下面来用一个登录实例来演示一下Struts的国际化配置和显示。
创建一个login_i18n_exception的javaweb项目,引入Struts的所有jar包以及jstl.jar和standard.jar。登录界面无非就是输入用户名,密码,所以ActionForm中只需要设置2个属性即可。
- package com.bjpowernode.struts;
- import org.apache.struts.action.ActionForm;
- /**
- * 登录ActionForm,负责收集表单数据
- * 表单的数据必须和ActionForm的get,set一致
- * @author Longxuan
- *
- */
- @SuppressWarnings("serial")
- public class LoginActionForm extends ActionForm {
- private String username;
- private String password;
- public String getUsername() {
- return username;
- }
- public void setUsername(String username) {
- this.username = username;
- }
- public String getPassword() {
- return password;
- }
- public void setPassword(String password) {
- this.password = password;
- }
- }
登录时会验证密码是否正确,需要提供异常处理,本实例显示2个异常:用户名未找到,密码错误。
- package com.bjpowernode.struts;
- /**
- * 密码错误异常
- * @author Longxuan
- *
- */
- @SuppressWarnings("serial")
- public class PasswordErrorException extends RuntimeException {
- public PasswordErrorException() {
- // TODO Auto-generated constructor stub
- }
- public PasswordErrorException(String message) {
- super(message);
- // TODO Auto-generated constructor stub
- }
- public PasswordErrorException(Throwable cause) {
- super(cause);
- // TODO Auto-generated constructor stub
- }
- public PasswordErrorException(String message, Throwable cause) {
- super(message, cause);
- // TODO Auto-generated constructor stub
- }
- public PasswordErrorException(String message, Throwable cause,
- boolean enableSuppression, boolean writableStackTrace) {
- super(message, cause, enableSuppression, writableStackTrace);
- // TODO Auto-generated constructor stub
- }
- }
- package com.bjpowernode.struts;
- /**
- * 用户未找到异常
- * @author Longxuan
- *
- */
- @SuppressWarnings("serial")
- public class UserNotFoundException extends RuntimeException {
- public UserNotFoundException() {
- // TODO Auto-generated constructor stub
- }
- public UserNotFoundException(String message) {
- super(message);
- // TODO Auto-generated constructor stub
- }
- public UserNotFoundException(Throwable cause) {
- super(cause);
- // TODO Auto-generated constructor stub
- }
- public UserNotFoundException(String message, Throwable cause) {
- super(message, cause);
- // TODO Auto-generated constructor stub
- }
- public UserNotFoundException(String message, Throwable cause,
- boolean enableSuppression, boolean writableStackTrace) {
- super(message, cause, enableSuppression, writableStackTrace);
- // TODO Auto-generated constructor stub
- }
- }
提供用户管理类,处理用户的相关操作,这里主要处理用户登录:
- package com.bjpowernode.struts;
- /**
- * 用户管理类
- * @author Longxuan
- *
- */
- public class UserManager {
- /**
- * 简单处理登录逻辑
- * @param username 用户名
- * @param password 密码
- */
- public void login(String username,String password){
- if(!"admin".equals(username)){
- throw new UserNotFoundException();
- }
- if(! "admin".equals(password)){
- throw new PasswordErrorException();
- }
- }
- }
现在写LoginAction的处理:
- package com.bjpowernode.struts;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import org.apache.struts.action.Action;
- import org.apache.struts.action.ActionForm;
- import org.apache.struts.action.ActionForward;
- import org.apache.struts.action.ActionMapping;
- import org.apache.struts.action.ActionMessage;
- import org.apache.struts.action.ActionMessages;
- /**
- * 登录Action 负责取得表单数据,调用业务逻辑,返回转向信息
- *
- * @author Longxuan
- *
- */
- public class LoginAction extends Action {
- @Override
- public ActionForward execute(ActionMapping mapping, ActionForm form,
- HttpServletRequest request, HttpServletResponse response)
- throws Exception {
- //获取数据
- LoginActionForm laf = (LoginActionForm) form;
- String username = laf.getUsername();
- String password = laf.getPassword();
- UserManager userManager = new UserManager();
- ActionMessages messages = new ActionMessages();
- try {
- //用户登录
- userManager.login(username, password);
- //获取登录成功的国际化消息
- ActionMessage success= new ActionMessage("login.success",username);
- messages.add("login_success_1",success);
- //传递消息
- this.saveMessages(request, messages);
- return mapping.findForward("success");
- } catch (UserNotFoundException e) {
- e.printStackTrace();
- //获取登录成功的国际化消息
- ActionMessage error = new ActionMessage("login.user.not.found",username);
- messages.add("login_error_1",error);
- //传递消息
- this.saveErrors(request, messages);
- } catch (PasswordErrorException e) {
- e.printStackTrace();
- //获取登录成功的国际化消息
- ActionMessage error = new ActionMessage("login.user.password.error");
- messages.add("login_error_2",error);
- //传递消息
- this.saveErrors(request, messages);
- }
- return mapping.findForward("error");
- }
- }
来一个手动切换语言的类,方便演示:
- package com.bjpowernode.struts;
- import java.util.Locale;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import org.apache.struts.action.Action;
- import org.apache.struts.action.ActionForm;
- import org.apache.struts.action.ActionForward;
- import org.apache.struts.action.ActionMapping;
- /**
- * 完成语言的手动切换
- * @author Longxuan
- *
- */
- public class ChangeLanguageAction extends Action {
- @Override
- public ActionForward execute(ActionMapping mapping, ActionForm form,
- HttpServletRequest request, HttpServletResponse response)
- throws Exception {
- //获取语言
- String lang = request.getParameter("lang");
- String[] split = lang.split("-");
- //设置语言
- Locale locale = new Locale(split[0],split[1]);
- this.setLocale(request, locale);
- return mapping.findForward("login");
- }
- }
新建国际化信息文件:创建resource包,创建 英文语言包MessageBundle_en_US.properties,中文语言包MessageBundle_zh_CN.properties,默认语言包MessageBundle.properties 这3个语言包。具体内容如下:
英文语言包和默认语言包设置成一样的:
- # -- standard errors --
- errors.header=<UL>
- errors.prefix=<font color="red"><LI>
- errors.suffix=</LI></font>
- errors.footer=</UL>
- login.form.field.username=User Name
- login.form.field.password=Password
- login.form.button.login=Login
- login.success={0},Login Succedd!!
- login.user.not.found=Use cant be found! Username=[{0}]
- login.user.password.error=Password Error!
中文语言包:
- # -- standard errors --
- errors.header=<UL>
- errors.prefix=<font color="red"><LI>
- errors.suffix=</LI></font>
- errors.footer=</UL>
- login.form.field.username=\u7528\u6237\u540D
- login.form.field.password=\u5BC6\u7801
- login.form.button.login=\u767B\u5F55
- login.success={0}\uFF0C\u767B\u5F55\u6210\u529F\uFF01
- login.user.not.found=\u7528\u6237\u672A\u627E\u5230\uFF0C\u7528\u6237\u540D\uFF1A\u3010{0}\u3011
- login.user.password.error=\u5BC6\u7801\u9519\u8BEF
把login.jsp源码也贴出来:
- <%@ page language="java" contentType="text/html; charset=GB18030"
- pageEncoding="GB18030"%>
- <%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean"%>
- <%@ taglib uri="http://struts.apache.org/tags-html" prefix="html"%>
- <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
- <!-- ${sessionScope['org.apache.struts.action.LOCALE']}可以获取到当前设置的语言 -->
- <fmt:setLocale value="${sessionScope['org.apache.struts.action.LOCALE']}" />
- <fmt:setBundle basename="resource.MessageBundle" />
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=GB18030">
- <title>Struts登录</title>
- </head>
- <body>
- <a href="changelang.do?lang=zh-cn">中文登录</a>|
- <%--<a href="changelang.do?lang=en-us">English Login</a><br>
- <html:link action="changelang.do?lang=zh-cn">中文登录</html:link>|--%>
- <html:link action="changelang.do?lang=en-us">English Login</html:link>
- <hr>
- <html:errors />
- <hr>
- <h3>
- struts标签读取国际化文件
- </h3>
- <form action="login.do" method="post">
- <bean:message key="login.form.field.username" />
- :
- <input type="text" name="username" />
- <br />
- <bean:message key="login.form.field.password" />
- :
- <input type="text" name="password" />
- <br />
- <input type="submit"
- value="<bean:message key="login.form.button.login"/>" />
- </form>
- <hr>
- <h3>
- jstl读取国际化文件
- </h3>
- <form action="login.do" method="post">
- <fmt:message key="login.form.field.username" />
- :
- <input type="text" name="username" />
- <br />
- <fmt:message key="login.form.field.password" />
- :
- <input type="text" name="password" />
- <br />
- <input type="submit"
- value="<fmt:message key="login.form.button.login"/>" />
- </form>
- </body>
- </html>
login_success.jsp:
- <%@ page language="java" contentType="text/html; charset=GB18030"
- pageEncoding="GB18030"%>
- <%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>
- <%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %>
- <!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=GB18030">
- <title>Insert title here</title>
- </head>
- <body>
- <!-- message 属性设置为true,则读取message中的消息,false,则读取error中的消息。 saveMessages/saveErrors-->
- <html:messages id="msg" message="true">
- <bean:write name="msg"/>
- </html:messages>
- </body>
- </html>
最后的最后,在web.xml中配置一下struts:
- <?xml version="1.0" encoding="UTF-8"?>
- <web-app version="2.4"
- xmlns="http://java.sun.com/xml/ns/j2ee"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
- http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
- <welcome-file-list>
- <welcome-file>login.jsp</welcome-file>
- </welcome-file-list>
- <servlet>
- <servlet-name>action</servlet-name>
- <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
- <init-param>
- <param-name>config</param-name>
- <param-value>/WEB-INF/struts-config.xml</param-value>
- </init-param>
- <init-param>
- <param-name>debug</param-name>
- <param-value>2</param-value>
- </init-param>
- <init-param>
- <param-name>detail</param-name>
- <param-value>2</param-value>
- </init-param>
- <load-on-startup>2</load-on-startup>
- </servlet>
- <!-- Standard Action Servlet Mapping -->
- <servlet-mapping>
- <servlet-name>action</servlet-name>
- <url-pattern>*.do</url-pattern>
- </servlet-mapping>
- </web-app>
在Struts-config.xml中配置action,actionform等信息:
- <?xml version="1.0" encoding="ISO-8859-1" ?>
- <!DOCTYPE struts-config PUBLIC
- "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"
- "http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd">
- <struts-config>
- <form-beans>
- <form-bean name="loginForm" type="com.bjpowernode.struts.LoginActionForm"></form-bean>
- </form-beans>
- <action-mappings>
- <action path="/login"
- type="com.bjpowernode.struts.LoginAction"
- name="loginForm"
- scope="request" >
- <forward name="success" path="/login_success.jsp"></forward>
- <!--<forward name="error" path="/login_error.jsp"></forward>-->
- <forward name="error" path="/login.jsp"></forward>
- </action>
- <action path="/changelang"
- type="com.bjpowernode.struts.ChangeLanguageAction"
- >
- <forward name="login" path="/login.jsp" redirect="true"></forward>
- </action>
- </action-mappings>
- <message-resources parameter="resource.MessageBundle"></message-resources>
- </struts-config>
到此实例结束。点击这里查看效果。也可以下载源码。最后来2张效果图吧。
相关推荐
JSTL(JavaServer Pages Standard Tag Library)是Java官方提供的标准标签库,包含一系列用于处理常见Web任务的标签,如XML处理、数据库操作、国际化等。使用JSTL可以减少JSP页面中的脚本代码,使得页面更加整洁,...
本实例将探讨如何在Maven环境下搭建一个基于Spring、Struts2和JSTL的项目,这些技术的组合提供了强大的后端控制、依赖管理和前端展示能力。 首先,让我们详细了解每个组件的作用: 1. **Maven**:Maven是一个项目...
"运用JSP+Struts+JSTL技术的MVC架构项目实例源码.rar"是一个基于MVC架构的Web应用示例,它使用了Java Server Pages(JSP)、Struts框架和JavaServer Pages Standard Tag Library(JSTL)这三种关键技术。 首先,JSP...
以用户管理为例,结合spring struts hibernate dwr jstl做的实例,struts hibernate dwr 与Spring完全结合,实现用户列表、信息增、删、改、查、维护时用户重名提示等功能,还包括页面自动转码设置(web.xml),...
本项目“运用JSP+Struts+JSTL技术的MVC架构,数据库采用SQL Server留言本”就是一个典型的MVC应用实例,它结合了多种技术来创建一个基于Web的留言系统。 首先,JSP(JavaServer Pages)是Java平台上的动态网页技术...
在描述中提到了`jstl`标签库,JSTL(JavaServer Pages Standard Tag Library)是一套用于JSP页面的标准标签库,包括核心标签、XML标签、JDBC标签等。其中,JDBC标签可以用来执行SQL查询,简化了在JSP页面中处理...
此外,JSP还可以通过脚本元素或JSTL(JavaServer Pages Standard Tag Library)标签来显示从数据库检索的数据,或者呈现用户操作的结果。 这个实例可能包含以下组件: 1. Employee实体类:代表员工对象,包含姓名、...
在JSP页面上,使用JSTL或其他标签库遍历数据列表,并显示分页导航。导航通常包含“上一页”、“下一页”、页码链接等元素。 7. **处理分页请求** 当用户点击分页链接时,Action类需要捕获请求参数,如页码和每页...
4. 标签支持:Struts1使用JSTL和自定义标签,而Struts2使用OGNL表达式语言和丰富的内置标签。 5. 验证:Struts1的验证通常是手动实现,而Struts2支持手动和验证框架的集成,提供更灵活的验证机制。 在Web项目开发...
综上所述,这个项目展示了如何使用Struts2、Spring和Hibernate集成开发Java Web应用,特别是登录注册功能,涵盖了前端验证、后端业务处理、数据库操作、安全性等多个方面,是学习和实践Java Web开发的一个良好实例。
在与Struts结合时,Spring可以作为Action的工厂,实现Action的实例化和依赖注入。 **iBATIS2.3** 是一个数据访问框架,它允许开发者将SQL语句写在配置文件中,与Java代码分离。这既保留了SQL的灵活性,又避免了直接...
在"struts2+spring+hibernate实例"中,这三者通常会按照以下方式集成: 1. **配置整合**:在Spring配置文件中,声明Struts2的Action Bean,并配置与Hibernate相关的数据源、SessionFactory等。Spring可以管理Struts...
通过深入理解Struts2框架和SQL Server 2000数据库系统的特性及相互间的整合,开发者能够构建出功能强大、稳定可靠的城市信息网络平台,满足用户多样化的需求。同时,随着技术的演进,升级到更现代的数据库系统和框架...
下面将详细解释如何在Struts1中进行国际化实践,并结合给出的实例进行解析。 一、国际化(i18n)基础 国际化是指软件设计时考虑到不同地区的语言和文化差异,使得软件可以轻松地适应多种语言环境。在Web应用中,这...
Struts2标签库是基于JSP标准标签库(JSTL)的扩展,它包含了一系列用于构建动态Web应用的标签。这些标签分为两类:核心标签和主题标签。核心标签主要处理表单、控制流程和显示数据,而主题标签则负责渲染视图,提供...
8. **国际化与本地化**:Struts1支持多语言,可以在项目的资源文件(如messages.properties)中定义不同语言的文本,然后在JSP中使用fmt标签库进行国际化显示。 这个"struts1+jdbc"的示例项目可以帮助初学者理解...
4. **其他依赖库**:如jstl.jar、log4j.jar、commons-logging.jar等,用于JSP标签库、日志记录以及通用工具函数。 5. **项目源代码**:包括Action类、Model类、DAO类、Service类等,实现了业务逻辑和数据操作。 6. *...
3. **JSP基础**:掌握JSP的基本语法,包括声明、脚本元素、JSP表达式、JSTL标签等,以及如何在JSP中嵌入Java代码和调用Struts2的动作。 4. **Ajax应用**:学习使用JavaScript的XMLHttpRequest对象或者jQuery的ajax...
在Struts2中,自定义标签基于JSP标准标签库(JSTL)的实现,通过Action类与标签库之间的交互来动态生成内容。 一、创建自定义标签库 1. 定义标签接口:在Struts2中,我们通常使用`...
通过 Spring 的 ContextLoaderListener 初始化 Spring 容器,并将 Struts 2 的 Action 实例交由 Spring 管理。 2. **JPA 配置**:设置 JPA 的实体类,定义数据模型,并配置 persistence.xml 文件来指定数据源、实体...