Struts 2.x权威指南
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

3.6.5 plainText结果类型

plainText 结果类型并不常用,因为它的作用太过局限:它主要用于显示实际视图资源的源代码。对于如下简单的Action类:

程序清单:codes\03\3.6\plainText\WEB-INF\src\org\crayzit\struts2\action\LoginAction.java

public class LoginAction implements Action
{
    // 用于封装请求参数的username属性
    private String username;
    // username属性的setter和getter方法
    public String getUsername()
    {
          return username;
    }
    public void setUsername(String username)
    {
          this.username = username;
    }
    // 处理用户请求的execute方法
    public String execute() throws Exception
    {
          return SUCCESS;
    }
}

上面的Action类并未真正处理用户请求,它只是简单地返回了一个success的逻辑视图。在struts.xml文件中配置该Action,如果采用如下配置片段——

程序清单:codes\03\3.6\plainText\WEB-INF\src\struts.xml

<?xml version="1.0" encoding="GBK" ?>
<!-- 指定Struts 2配置文件的DTD信息 -->
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">
<!-- 配置Struts 2配置文件的根元素 -->
<struts>
    <constant name="struts.i18n.encoding" value="GBK"/>
    <!-- Struts 2的Action必须放在指定的包空间下定义 -->
    <package name="crazyit" extends="struts-default">
          <action name="login" class="org.crazyit.struts2.action.LoginAction">
                <!-- 如果处理结果返回success,则进入welcome.jsp页面 -->
                <result>/WEB-INF/content/welcome.jsp</result>
          </action>
          <action name="*">
                <result>/WEB-INF/content/{1}.jsp</result>
          </action>
    </package>
</struts>

在上面的配置片段中,在配置<result.../>元素时,并未为该<result.../> 指定 name 和 type属性,这意味着name属性值为success,而type属性值为dispatcher。该Result对应的视图资源:welcome.jsp页面的代码如下。

程序清单:codes\03\3.6\plainText\WEB-INF\content\welcome.jsp

<%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>欢迎</title>
</head>
<body>
    <s:property value="username"/>
</body>
</html>

这个页面非常简单,仅仅在页面中输出Action实例的username属性值。如果用户输入任意的username请求参数,然后单击“提交”按钮,将看到如图3.21所示的页面。

图3.21 正常显示的JSP页面

如果修改上面struts.xml文件中的<result .../>元素,为该元素增加type="plainText"属性,即指定显示视图资源的源文件。

在服务器端重新加载Web应用,在页面中输入任意的username属性值,然后单击“提交”按钮,将看到如图3.22所示的页面。

图3.22 显示源代码的JSP页面

正如图3.22所显示的,如果使用plainText结果类型,系统将把视图资源的源代码呈现给用户。

如果在welcome.jsp页面的代码中包含了中文字符,使用plainText结果类型将会看到乱码。在图3.22中我们看到,<title>和</title>中间的本来应该是“欢迎”字符串,但此处变成了乱码。

为了解决这个问题,Struts 2允许为plainText设置相应的字符集,通过为<result .../>元素增加一个<param .../>元素可以设置使用特定的字符集来解析页面代码。

将struts.xml文件修改如下。

程序清单:codes\03\3.6\plainText\WEB-INF\src\struts.xml

<?xml version="1.0" encoding="GBK" ?>
<!-- 指定Struts 2配置文件的DTD信息 -->
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">
<!-- 配置Struts 2配置文件的根元素 -->
<struts>
    <constant name="struts.i18n.encoding" value="GBK"/>
    <!-- Struts 2的Action必须放在指定的包空间下定义 -->
    <package name="crazyit" extends="struts-default">
          <action name="login" class="org.crazyit.struts2.action.LoginAction">
                <result type="plainText">
                    <!-- 指定实际的视图资源 -->
                    <param name="location">/WEB-INF/content/welcome.jsp</param>
                    <!-- 指定使用特定的字符集来处理页面代码 -->
                    <param name="charSet">GBK</param>
                </result>
          </action>
          <action name="*">
                <result>/WEB-INF/content/{1}.jsp</result>
          </action>
    </package>
</struts>

再次向该Action请求,将看到如图3.23所示的页面。

图3.23 使用GBK字符集来显示源代码的JSP页面

在图3.23所示页面的标题中,中文已经正常显示出来。