为项目添加Struts2支持,用的是struts-2.1.6版本的Struts2
Struts2的struts-2.1.6的下载链接,在我的百度网盘里面有
http://pan.baidu.com/s/1bn8PANl
在下载好的Struts2目录的lib下找到下面的jar包,复制到项目的WEB-INF下的lib中
配置struts.xml文件,在项目src目录下新建struts.xml文件,配置如下代码
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <!-- <constant name="struts.enable.DynamicMethodInvocation" value="false" /> <constant name="struts.devMode" value="false" /> <include file="example.xml"/> <package name="default" namespace="/" extends="struts-default"> <default-action-ref name="index" /> <action name="index"> <result type="redirectAction"> <param name="actionName">HelloWorld</param> <param name="namespace">/example</param> </result> </action> </package> --> <package name="default" namespace="/" extends="struts-default"> <action name="login" class="net.hncu.struts2.action.LoginAction"> <result name="error">/login_failure.jsp</result> <result name="success">/login_success.jsp</result> <result name="input">/login.jsp</result> </action> </package> <!-- Add packages here --> </struts>
配置web.xml文件,修改WEB-INF下的wev.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"> <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
编写java类,主要由LoginAction.java和LoginCheck.java,LoginAction类处理主要的逻辑业务,LoginCheck类用于设置登陆验证的密码和用户名,主要用于校验登陆信息。代码如下
LoginAction.java
package net.hncu.struts2.action; import net.hncu.struts2.LoginCheck.LoginCheck; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport; public class LoginAction extends ActionSupport { private String uname; private String upassword; public String getUname() { return uname; } public void setUname(String uname) { this.uname = uname; } public String getUpassword() { return upassword; } public void setUpassword(String upassword) { this.upassword = upassword; } //执行输入 public void validate(){ //如果用户名为null,或者为空的话,那么提示错误信息 if(getUname()==null||"".equals(getUname().trim())){ this.addFieldError("uname",getText("username.required")); } //如果密码为null,或者为空的话,那么提示错误信息 if(getUpassword()==null||"".equals(getUpassword().trim())){ this.addFieldError("upassword",getText("password.required")); } } //重写execute方法,实现跳转 public String execute()throws Exception{ LoginCheck lc=new LoginCheck(); if(lc.isLogin(getUname(),getUpassword())){ ServletActionContext.getRequest().setAttribute("login","true"); return "success"; } else{ return "failure"; } } }
LoginCheck.java
package net.hncu.struts2.LoginCheck; public class LoginCheck { public boolean isLogin(String name,String password){ if("liuyanbing".equals(name)&&"liuyanbing".equals(password)){ return true; }else{ return false; } } }
注意这里为两个类都设置了包名。
开始程序国际化操作,程序国际化是为了处理国外人士使用该程序时,能够给予国外语言的反馈。比如当中国用户没有在登陆框中输入密码或者用户名,则显示中文提示信息,让用户注意;而国外人士没有输入用户名或者密码的时候,则用英文或者其他语言显示提示信息。这里使用zh_CN(中文简体)和en_US(美国英语)作为程序国际化的实例。
创建properties(资源文件),在项目的src目录下新建两个properties文件,分别命名为messageResource_en_US.properties
messageResource_zh_CN.properties
资源文件命名规则非常重要,意味着你是否能够顺利实现程序国际化,具体命名规则是,basename_语言代码_国家代码.properties。
中文环境messageResource_zh_CN.properties资源文件内容如下
login.title=登陆 login.username=用户名 login.password=密码 password.required=必须输入密码 username.required=必须输入用户名
由于编码问题,如果在myeclipse下的java编码默认为iso-8859的话,将无法保存中文内容编码,因此必须在myeclipse下打开Windows--Preferences--General--Content Types--Text-Java Properties File下的Default encoding改为utf-8,然后Update。就可以保存中文环境下的messageResource_zh_CN.properties资源文件了。
但由于中文还是属于非西欧字符,所以必须将该字符转换成Unicode编码字符,才能让资源文件辨识value值。这里可以使用JDK安装目录中bin目录下的"native2ascii.exe"文件,打开后就像CMD一样,输入中文得到该中文的Unicode编码字符。如下所示
赋值上面的Unicode编码字符,替换掉中文环境messageResource_zh_CN.properties资源文件的内容,如下
login.title=\u767B\u9646 login.username=\u7528\u6237\u540D login.password=\u5BC6\u7801 password.required=\u5fc5\u987b\u8f93\u5165\u5bc6\u7801 username.required=\u5fc5\u987b\u8f93\u5165\u7528\u6237\u540d
英文环境messageResource_en_US.properties资源环境的配置相对简单,代码如下
login.title=login login.username=username login.password=password password.required=password was required username.required=username was required
配置好资源文件之后,接下来就是加载资源文件,有两种方法
第一种方法是在struts.xml文件中配置struts.custom.il8.resources常量,在<struts>标签中添加如下<constant>元素,如下
<constant name="struts.custom.il8n.resources=messageResource" value="messageResource"></constant> <!-- =后面的messageResource是资源文件的basename名称 -->
第二种方法是在src目录下新建struts.properties文件,输入以下代码:
struts.custom.il8n.resources=messageResource
最后建立jsp登陆验证页面。首先建立两个跳转结果页面,分别是登陆成功页面login_success.jsp和登陆失败页面login_failure.jsp页面。代码如下
login_success.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'login_success.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> <center> <% if(request.getAttribute("login")!=null&&request.getAttribute("login").equals("true")){ %> <h2>登陆成功</h2> <% }else{ %> <jsp:forward page="login.jsp"></jsp:forward> <% } %> </center> </body> </html>
login_failure.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'login_failure.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> <center> <h2>登录失败</h2> </center> </body> </html>
最后建立登陆验证页面login.jsp,这里使用了struts2标签库,所以必须在jsp页面引入struts-tags
<% @taglib prefix="s" uri="/struts-tags" %>
具体的login.jsp代码如下
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <%@taglib prefix="s" uri="/struts-tags" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title><s:text name="login.title"></s:text></title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> <center> <s:i18n name="messageResource"> <s:text name="login.title"></s:text> <s:form action="login"> <s:textfield name="uname" key="login.username"></s:textfield> <s:password name="upassword" key="login.password"></s:password> <s:submit value="登陆"></s:submit> <s:reset value="重置"></s:reset> </s:form> </s:i18n> </center> </body> </html>
建立好所需代码文件后,部署项目,为了验证程序国际化,就不在myeclipse中进行debug,而是在internet explorer中进行调试。调试中文环境结果如下
浏览器中设置首语言
调试英文环境结果如下: