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所示页面的标题中,中文已经正常显示出来。