Struts中的常用类
import java.util.Vector;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.sql.DataSource;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.action.ActionMessages;
javax.servlet.ServletContext;
该类主要用于根据struts-config.xml中的信息使用getAttribute()方法取得与之相关的对象,如javax.sql.DataSource对象。ServletContext对象由Action的变量servlet取得
javax.servlet.http.HttpSession
由HttpServletRequest.getSession()方法取得主要用于存取用户信息
javax.sql.DataSource
public interface DataSource该工厂用于提供到此 DataSource 对象表示的物理数据源的连接。作为 DriverManager 设施的替代项,DataSource 对象是获取连接的首选方法。实现 DataSource 接口的对象通常在基于 JavaTM Naming and Directory Interface (JNDI) API 的命名服务中注册。 DataSource 接口由驱动程序供应商实现。共有三种类型的实现:
- 基本实现 - 生成标准 Connection 对象
- 连接池实现 - 生成自动参与连接池的 Connection 对象。此实现与中间层连接池管理器一起使用。
3. 分布式事务实现 - 生成一个 Connection 对象,该对象可用于分布式事务,并且几乎始终参与连接池。此实现与中间层事务管理器一起使用,并且几乎始终与连接池管理器一起使用。
DataSource 对象的属性在需要时可以修改。例如,如果将数据源移动到另一个服务器,则可更改与服务器相关的属性。其优点是,因为可以更改数据源的属性,所以任何访问该数据源的代码都无需更改。通过 DataSource 对象访问的驱动程序不会向 DriverManager 注册。通过查找操作检索 DataSource 对象,然后使用该对象创建 Connection 对象。使用基本的实现,通过 DataSource 对象获取的连接与通过 DriverManager 设施获取的连接相同。
org.apache.struts.action.Action;
控制器,子类需要覆盖其public ActionForward execute(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response)
throws Exception {}方法,并可以通过其servlet变量的getServletContext()方法取得需要的ServletContext对象。
saveErrors(request, errors)方法用于将ActionMessages对象保存到request中。再由相应的jsp页面用<html:errors/>标记把errors从消息资源文件中读取的消息显示出来。
org.apache.struts.action.ActionForm
模型组件,主要用于从视图组件向控制器组件传值,用于继承。
org.apache.struts.action.ActionForward
用于控制页面跳转的对象类。
org.apache.struts.action.ActionMapping
其findForward()方法用于返回ActionForward对象来控制页面的跳转。
例如:return mapping.findForward(“任意路径字符串”)该路径在struts-config.xml的<global-forwards>中定义。或者用以下方法代替
return (new ActionForward(mapping.getInput()));
mapping.getInput() 取的是<action-mappings> 里配置的input 参数.
org.apache.struts.action.ActionMessage;
该类主要用于与页面标记<html:errors/>一起使用,用来显示资源文件保存的消息。它有两个构造方法:ActionMessage(String s)其中s为消息资源文件*.properties中对应的项的键名。
ActionMessage(String s,Object o)s为任意字符串,o 为boolean行变量,通常
是ture. 表示是否读取消息资源文件中保存的消息。该对象通常保存在ActionMessages里。
org.apache.struts.action.ActionMessages
errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage(
"error.accessDeny"));将ActionMessage消息对象用键值对的形式保存到ActionMessages对象errors中最后再将errors对象保存到request中。例如:利用Action的saveErrors(request,errors)方法保存。
例子代码:
package j2eebbs.admin.action;
import j2eebbs.Constants;
import j2eebbs.DB;
import j2eebbs.User;
import j2eebbs.admin.form.AdminLoginForm;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.sql.DataSource;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.action.ActionMessages;
public final class AdminLoginAction extends Action {
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
//取得用户名
AdminLoginForm userform = (AdminLoginForm) form;
String username = userform.getUsername();
//利用配置文件struts-config.xml中datasource的信息取得数据库连接对象
//每个应用程序都对应一个servletcontext,可以用来读取配置文件中的信息
//其中DataSource接口由服务器实现
ServletContext context = servlet.getServletContext();
DataSource dataSource = (DataSource) context
.getAttribute(Constants.DATASOURCE_KEY);
DB db = new DB(dataSource);
//取得session对象用于保存该用户的信息
HttpSession session = request.getSession(true);
String PageForward;
ActionMessages errors = new ActionMessages();
if ("admin".equals(User.getUserGrade(db, username))) {
session.setAttribute(Constants.LOGIN_USERGRADE_KEY, "admin");
PageForward = "ToAdminIndex";
} else if ("banzhu".equals(User.getUserGrade(db, username))) {
session.setAttribute(Constants.LOGIN_USERGRADE_KEY, "banzhu");
PageForward = "ToAdminIndex";
} else {
//errors与<html:errors/>标记一起使用,用来在jsp页面中显示消息,其中
//ActionMessage与消息资源文件ApplicationResources.propertice相关联
errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage(
"error.accessDeny"));
if (!errors.isEmpty()) {
saveErrors(request, errors);
}
PageForward = "ToErrorPage";
}
db.close();
//用于在模型组件中控制页面的跳转,该方法与struts-config.xml中的<global-forwards>相关联
return mapping.findForward(PageForward);
}
}
Struts中的3种配置文件
1. struts-config.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd">
<struts-config> <!--<data-sources>标签用来配置数据源。指定了数据库驱动类,URL及访问数据库的用户名,密码--> <data-sources> <data-source key="bbsDB" type="org.apache.commons.dbcp.BasicDataSource"> <set-property property="driverClassName" value="org.gjt.mm.mysql.Driver" /> <set-property property="url" value="jdbc:mysql://localhost:3306/BBS" /> <set-property property="username" value="root" /> <set-property property="password" value="root" /> </data-source> </data-sources> <!--<form-beans>元素配置ActionForm Bean--> <form-beans> <form-bean name="userLoginForm" type="j2eebbs.user.form.UserLoginForm" /> </form-beans>
<global-exceptions />
<!--<global-forwards>元素配置全局的转发路径。 --> <global-forwards> <!—由控制器转发到JSP页面--> <forward name="UserLoginSucceed" path="/user/bbsindex.jsp" /> </global-forwards>
<!--<action-mappings>元素配置了一个action组件--> <!—input属性指定当表单验证失败时的转发路径--> <!—name属性指定需要传递给action的actionform bean--> <!—path属性指定请求访问action的路径--> <!—type属性指定action的完整类名--> <!—scope属性指定actionform bean的存放范围--> <!—validate属性指定是否执行表单验证有ture和false--> <action-mappings> <!—由JSP转发到控制器--> <action path="/userlogin" type="j2eebbs.user.action.UserLoginAction" name="userLoginForm" scope="session" input="/user/userlogin.jsp" /> <!—JSP转发到JSP--> <action path="/registration" forward="/user/registration.jsp" />
<action path="/logoff" type="j2eebbs.user.action.LogoffAction" /> <action path="/adminlogoff" type="j2eebbs.admin.action.AdminLogoffAction" /> <action path="/backtoadminindex" forward="/admin/adminindex.jsp" /> <action path="/adminloginjsp" forward="/admin/adminlogin.jsp" /> </action-mappings>
<!--< message-resources >标签定义了Resource Bundle使用的资源文件--> <!—parameter属性定义了该资源文件的文件名--> <message-resources parameter="j2eebbs.ApplicationResources_zh" /> </struts-config>
|
2.web.xml
//web.xml文件以一个XML头开始。 <?xml version="1.0" encoding="UTF-8"?>
//顶层元素为web-app。这里要注意一点,不象html,xml元素是大小写敏感的 //因此web-app必须用小写,xml不仅对大小写敏感还对出现在其他元素中的次序敏感。 //例如,xml头,web-app的次序不能改变。在web-app元素内,元素的次序也很重要。 //当元素的次序不正确时,服务器可以拒绝执行web应用。使用非标准元素次序的web.xml文件是不可移植//的。在如下的代码中,sevlet元素必须出现在所有servlet-mapping元素之前。 <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.4" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<servlet> //servlet-name标签定义用于web应用的servlet //下面两个元素指定由ActionServlet接收请求,并确定其如何响应。 <servlet-name>action</servlet-name> <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
//init-param标签定义了servlet初始化参数 //利用config指示ActionServlet的行为由指定的配置文件来指导。 <init-param> <param-name>config</param-name> <param-value>/WEB-INF/struts-config.xml</param-value> </init-param>
//下面的debug为整数值,它指定将有关处理的详细信息写至控制台的详细程度 //默认记为0,记录相对最少的日志信息。 <init-param> <param-name>debug</param-name> <param-value>3</param-value> </init-param>
//定义detail参数,指示将“映射”详细信息写至控制台的程度。 <init-param> <param-name>detail</param-name> <param-value>3</param-value> </init-param>
//使用<load-on-startup>完成在启动应用程序是装入servlet的功能 <load-on-startup>0</load-on-startup> </servlet>
//指定URL的结尾的命名模式 <servlet-mapping> <servlet-name>action</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping>
//指定欢迎页面。 <welcome-file-list> <welcome-file>userloginjsp.do</welcome-file> </welcome-file-list>
//还可以声明web应用所使用的struts标签库,本例中声名了4个标签库 //Struts Bean,Struts HTML,Struts Logic等。 <taglib> <taglib-uri>/WEB-INF/struts-logic.tld</taglib> <taglib-location>/WEB-INF/struts-logic.tld</taglib-location> </taglib>//其余的略。 </web-app> |
3.ApplicationResources_.properties
Struts中使用的消息资源文件在struts-config.xml中定义
<message-resources parameter="j2eebbs.ApplicationResources_zh" />
使用方法:
1. 在jsp页面中使用标记<bean:message key="userlogin.jsp.guest" />显示key键对应的消息值。
2. 由ActionMesage,和ActionMesages读取消息并保存到request中,然后在jsp页面中使用<html:errors/>标记即可。
Struts框架通过消息资源文件来支持国际化和本地化。除了默认的资源文件(使用本地语言编写)以外,一个web应用可以包含很多个用不同语言编写的消息资源文件,这些消息资源文件都存储在默认资源文件所在的目录中。所有的消息资源文件应包含相同的关键字,但关键字的值是用特定的语言编写的。
如果默认资源文件的名称是ApplicationResources.properties,那么用其他特定语言编写的资源文件的名称就应该是ApplicationResources_xx.properties(xx为ISO编码,如英语是en)。
消息资源文件的内容是一行行对应的键/值。例如 login.success=注册成功。
如果想要在消息资源文件ApplicationResources_zh.properties中输入中文字符,那么需要把该文件处理一下,如果不进行处理,中文字符会在系统中显示为乱码。
在不使用插件时,可以按照如下操作对消息资源文件ApplicationResources_zh.properties进行处理。
(1) 在ApplicationResources_zh.properties中输入中文字符,代码如下:
Login.success=注册成功
(2) 把ApplicationResources_zh.properties文件放到jdk安装路径下的/bin目录中
(3) 在windows系统中,打开命令行
(4) 输入cd c:/j2sdk 1.4.2 _10/bin ,按回车,进入jdk的bin目录。
(5) 输入以下命令:native2ascii ApplicationResources_zh.properties a.properties 回车运行。
(6) 删除当前资源文件ApplicationResources_zh.properties,把a.properties文件重命名为ApplicationResources_zh.properties。打开可见文件编辑完成。
#Generated by ResourceBundle Editor (http://eclipse-rbe.sourceforge.net) # Resources for parameter 'j2eebbs.ApplicationResources_zh' # Project P/ch15 # error.delete.failed为读取消息时使用的键值 error.delete.failed = /u5220/u9664/u5931/u8D25/uFF01 error.insert.failed = /u63D2/u5165/u5931/u8D25/uFF01 |