欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Struts2 中Action的数据传递问题和国际化问题

程序员文章站 2022-05-24 11:01:43
...

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框架时做的笔记