Struts2 中Action的数据传递问题和国际化问题
Struts2 中Action的数据传递问题和国际化问题
1. Action中数据在不同领域之间的传递
因为Struts2中的Action没有与任何 Servlet API进行耦合,但是对于一个Web应用来讲,不访问 Servlet API 的情况几乎是不可能的。因此,Struts2框架提供了一种更加轻松地方式来访问 Servlet API。在Java EE 应用中,通常是通过类 HttpServletRequest、HttpServletResponse 和 ServletContext 访问 Servlet API,这三个类分别代表着jsp中的内置对象 Request、Session 和 Application。
然而在Struts2 框架中却并不支持直接使用 java EE 应用的这三个类。在Struts2 框架中专门为访问 Servlet API 提供了一个名为 ActionContext 的类,在Struts2 的 Action 中通常通过该类来进行对 Servlet API 的访问。在 ActionContext 类中包含了如下几个常用的方法。
□. Object get(Object obj): 该方法类似于调用 HttpServletRequest 中的 getAttribute(String name) 方法。
□. Map getApplication(): 返回一个Map对象,该对象模拟了该应用的 ServletContext 实例。
□. static ActionContext getContext(): 静态方法,获取系统的 ActionContext实例。
□. Map getParameters(): 获取所有的请求参数,类似于调用 HttpServletRequest 对象的 getParameterMap() 方法。
□. Map getSession(): 返回一个Map对象,该对象模拟了一个 HttpSession 实例。
□. void setApplication(Map application): 直接传入一个Map实例,该Map实例里面的key-value 对换成 application 的属性名、属性值。
□. void setSession(Map Session): 直接传入一个Map实例,该Map实例里面的key-value 对换成 session 里面的属性名、属性值。
2. Struts2 的国际化
应用的国家化实现,首先应该有存放由各种版本语言编写的信息的地方。实际上,这些信息就被存储在多个文件中,每个文件对应着一种不同的语言版本。我们就把这些存放不同语言信息的文件称为资源文件,把所有的资源文件放在一起被称为资源包(Resource Bundle)
文件命名要求:资源文件必须以“.properties”作为后缀,文件名的前缀可以任意命名,习惯上有如下两种命名方式:
□. 文件名前缀.properties。
□. 文件名前缀_语言种类.properties。
而“语言种类”的格式必须是有效的 ISO 语言代码,ISO-639 标准定义的这些代码格式为英文小写、双字符。如下所示
语言 | 编码 |
---|---|
汉语(Chinese) | zh |
英语(English) | en |
法语(French) | fr |
德语(German) | de |
日语(Japanese) | it |
意大利(Italian) | ja |
3. 代码展示部分
(1)编写一个用户登录页面 login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title><s:text name="loginPage"></s:text></title>
</head>
<body>
<h3><s:text name="loginPage"></s:text></h3>
${tip }
<s:form action="testLogin" method="post">
<s:textfield name="username" key="user"></s:textfield>
<s:password name="password" key="pass"></s:password>
<s:submit key="login"></s:submit>
</s:form>
<br><br>
<a href="${pageContext.request.contextPath }/test/welcome.jsp?function=${applicationScope.auto}">登录成功</a>
</body>
</html>
(2)编写一个用户登录失败后处理页面 error.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title><s:text name="errorPage"></s:text></title>
</head>
<body>
<s:text name="failTip">
<!-- 为国际化占位符赋值 -->
<s:param>${applicationScope.user }</s:param>
</s:text>
</body>
</html>
(3)编写一个用户登录成功后处理页面 welcome.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title><s:text name="successPage"></s:text></title>
</head>
<body>
本网站访问次数:${applicationScope.counter }<br>
<s:text name="successTip">
<!-- 为国际化占位符赋值 -->
<s:param>${sessionScope.user }</s:param>
</s:text>
<br><br>
<a href="${pageContext.request.contextPath }/test/login.jsp">返回登录</a>
</body>
</html>
(4)在web应用类加载路径下编写Struts2 框架的核心拦截Filter
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>chapter03</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<!-- 定义filter -->
<filter>
<filter-name>struts2</filter-name>
<!-- filter的实现类,此处是Struts2的核心过滤器 -->
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<!-- filter的名字,必须是filter元素中已经声明过的过滤器的名字 -->
<filter-name>struts2</filter-name>
<!-- 定义filter负责拦截的URL地址 -->
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
(5)编写映射文件 struts.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<constant name="struts.custom.i18n.resources" value="mess"></constant>
<constant name="struts.i18n.encoding" value="UTF-8"></constant>
<package name="struts2" namespace="/" extends="struts-default">
<action name="testLogin" class="test.LoginAction" method="execute">
<result name="success">/test/welcome.jsp</result>
<result name="input">/test/login.jsp</result>
<result name="error">/test/error.jsp</result>
</action>
</package>
</struts>
(6)提供两个资源文件:Application_en.properties、Application_zh.properties
#Application_en.properties
login=login
user=username
pass=password
loginPage=Welcome to Login Page!
errorpage=Sorry,{0}, you can`t log in!
failTip=Sorry,{0}, you was failed to log in!
successTip=Welcome,you has logged in!
inputTip=you The content that you enter cannot be blank!
successPage=Welcome to Login Page!
#Application_zh.properties
login=\u767B\u5F55
user=\u7528\u6237\u540D
pass=\u5BC6---\u7801
loginPage=\u7528\u6237\u767B\u5F55\u9875\u9762
errorPage=\u767B\u5F55\u5931\u8D25\u9875\u9762
failTip=\u5BF9\u4E0D\u8D77\uFF0C{0}\uFF0C\u60A8\u4E0D\u80FD\u767B\u5F55\uFF01
successTip=\u606D\u559C\u60A8\uFF0C{0}\uFF0C\u6210\u529F\u767B\u5F55\uFF01
inputTip=\u7528\u6237\u540D\u6216\u5BC6\u7801\u4E0D\u80FD\u4E3A\u7A7A\uFF01
successPage=\u7528\u6237\u767B\u5F55\u9875\u9762\uFF01
(7)设计一个用户登录处理Action类 ActionLogin.java
package test;
import javax.servlet.http.Cookie;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import cn.zdxh.domain.User;
public class LoginAction extends ActionSupport {
//定义两个变量用来接收请求数据
private String username;
private String password;
//为两个变量设置set、get方法
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;
}
//获取当前上下文的处理Servlet API
ActionContext context = ActionContext.getContext();
public String execute() {
//通过ActionContext 访问 application 范围的属性
Integer counter = (Integer) context.getApplication().get("counter");
/*
* 此处的功能是为了累计用户访问的次数
* */
if(counter == null) {
counter = 1;
} else {
counter++;
}
context.getApplication().put("counter", counter);
context.getApplication().put("user", getUsername());
if(getUsername() == null || getPassword() == null) {
context.put("tip", getText("inputTip"));
return INPUT;
} else {System.out.println(username+"---"+password);
if(getUsername().equals("lcy") && getPassword().equals("123456")) {
//通过application 设置Session范围属性
context.getSession().put("user", getUsername());
//通过response添加cookie,往cookie存放内容
Cookie cookie = new Cookie("user", getUsername());
//为cookie设置生命周期,单位:秒
cookie.setMaxAge(60*60);
//通过ServletActionContext 来把cookie响应到浏览器端
ServletActionContext.getResponse().addCookie(cookie);
//通过ActionContext设置Request范围属性,根据key去出国际化信息,并为占位符指定值
context.put("tip", getText("successTip", new String[] {getUsername()}));
return SUCCESS;
} else {
context.put("tip", getText("failTip", new String[] {getUsername()}));
return ERROR;
}
}
}
}
本次章节到此结束,如有问题多多赐教
本篇文章内容是本人在《javaEE 企业级开发》学习Struts框架时做的笔记
上一篇: 吕布死前对曹操大喊了哪六个字?曹操为何没有听他的话
下一篇: 计算机启动故障修复一例
推荐阅读
-
浅析Oracle中sys、system和Scott用户下的数据库连接问题
-
关于Oracle中sys、system和Scott用户下的数据库连接问题
-
ASP 包含文件中的路径问题和使用单一数据库连接文件的解决方案
-
解决ASP.NET MVC返回的JsonResult 中 日期类型数据格式问题,和返回的属性名称转为“驼峰命名法”和循环引用问题
-
浅析Oracle中sys、system和Scott用户下的数据库连接问题
-
Struts2中namespace和result的路径问题
-
Vue项目中修改数组和对象页面的中的数据不进行跟新问题
-
关于Oracle中sys、system和Scott用户下的数据库连接问题
-
ASP 包含文件中的路径问题和使用单一数据库连接文件的解决方案
-
解决ASP.NET MVC返回的JsonResult 中 日期类型数据格式问题,和返回的属性名称转为“驼峰命名法”和循环引用问题