阅读struts MailReader文档笔记:
MailReader应用程序基于struts 1.2.0开发。
1:主页是index.jsp。由于struts的Action不能指定欢迎页面
,而首次会从服务器配置的欢迎列表去查找出相应的页面返回给用户,
那么我们怎么来用struts的actions而不是普通的jsp页面返回给用户呢,
一个解决方案是在一个页面写上要转发到我们的欢迎页面,代码:
<%@ taglib uri="/tags/struts-logic" prefix="logic" %>
<logic:redirect action="/Welcome"/>
在相应的struts-config.xml配置文件加上
<!-- Display welcome page -->
<action path="/Welcome" forward="/welcome.jsp" />
但其它页面还不能保证用户不能访问到,我们在应用当中一般会把所有的
jsp页面放到WEB-INF目录下面,然后在struts-config.xml做一下映射就可以了,以保证用户不能直接访问到。
2:<message-resources parameter="org.apache.struts.webapp.example.MessageResources" />
在同一个struts里面只能有一个默认的存放本地化的消息文本(Resource Bundle)
那很我们指定多个的时候可以用它的一个属性key指定
例如:
<message-resources parameter="org.apache.struts.webapp.example.AlternateMessageResources" key="alternate" />
那么我们在页面用的时候这样出别
<bean:message key="key0"/>;
<bean:message key="key1" bundle="alternate"/>
3:<html:link>有两个优点:
(1)允许在url中以多种方式包含请求。
(2)当用户关闭cookie时,会自动重写url,把sessionid作为请求参数包含在url当中,用于跟踪用户的session状态,而不像servlet,jsp还要
自己硬编码实现
它有几个重要的属性:
*forward:指定全局转发链接(只适用于(flobal-forwards>forward,而不能引用action forward子元素)
*href:指定完整的url链接(<html:link url="http//www.sina.com"/>)
*page:指定相对于当前网页的url(<html:link page="/test.do"/>
4:PlugIn(struts插件)
在struts-config.xml要加上相应的描述语句
<plug-in className="org.apache.struts.webapp.example.memory.MemoryDatabasePlugIn">
<set-property property="pathname" value="/WEB-INF/database.xml"/>
</plug-in>
其中MemoryDatabaseplugIn是自己开发的一个插件,它必须org.paache.struts.action.PlugIn接口,包含两个方法init,destroy
init在struts加载时自动被调用,destroy当应用关闭时调用,可以放一些释放资源的语句(如关闭数据库连接的语句等)
并且这个里面还包含属性pathname,也要相应的get,set方法,以便在struts框架在加载插件时,会自动调用setPathname()方法,把
<set-property>子元素的pathname设置成MemoryDatabasePlugIn里对应属性的值value="/WEB-INF/database.xml"
还要注意就是<plug-in>必须位于其它配置元素后面,出现多个按顺序加载
5:
<!-- Process a user logon -->
<action path="/SubmitLogon"
type="org.apache.struts.webapp.example.LogonAction"
name="LogonForm"
scope="request"
input="logon">
<exception
key="expired.password"
type="org.apache.struts.webapp.example.ExpiredPasswordException"
path="/ExpiredPassword.do"/>
</action>
scope推荐使用request,当然也可以用session,一个ActionForm只对应一次请求,不要越过request,
如果我们使用type="org.apache.struts.validator.DynaValidatorForm"
那么它会自动创建一个ActionForms与之对应
exception子元素,当一个用户登录以后,有可能 "ExpiredPasswordException"(超时) 会抛出.
如果发生了的话 Struts 会捕获exception 并发送到 "ExpiredPassword" action.
6:
自己开发一个定制标记<app:checkLogon/>用户检查用户是否登录
package org.apache.struts.webapp.example;
import ...
public final class CheckLogonTag extends TagSupport {
private String name = Constants.USER_KEY;
private static String LOGIN_PATH = "/Logon.do";
private String page = LOGIN_PATH;
public int doStartTag() throws JspException {
return (SKIP_BODY);
}
public int doEndTag() throws JspException {
boolean valid = false;
HttpSession session = pageContext.getSession();
if ((session != null) && (session.getAttribute(name) != null)) {
valid = true;
}
if (valid) {
return (EVAL_PAGE);
} else {
ModuleConfig config =
(ModuleConfig) pageContext.getServletContext().getAttribute(
org.apache.struts.Globals.MODULE_KEY);
try {
pageContext.forward(config.getPrefix() + page);
} catch (ServletException e) {
throw new JspException(e.toString());
} catch (IOException e) {
throw new JspException(e.toString());
}
return (SKIP_PAGE);
}
}
public void release() {
super.release();
this.name = Constants.USER_KEY;
this.page = LOGIN_PATH;
}
}
但如果比较大的应用还是用标准的jaas验证
7
<html:link action="/EditRegistration?action=Edit">
-------
///////////////////////////////////
<logic:equal
name="RegistrationForm"
property="action"
scope="request"
value="Edit"
>
<app:checkLogon/><!--如果action与Edit相等就执行这里,否则不会执行-->
</logic:equal>
1)////
<logic:present name="test">
如果在action中设置了test就执行到这儿。如:request.setAttribute("test","test")或session.setAttribute("test","test")
<bean:write name="test"/>
</logic:present>
package org.apache.struts.webapp.example;
public final class EditSubscriptionAction extends Action
{
public EditSubscriptionAction()
{
log = LogFactory.getLog("org.apache.struts.webapp.Example");
}
public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)
throws Exception
{
HttpSession session = request.getSession();
String action = request.getParameter("action");
if(action == null)
action = "Create";
String host = request.getParameter("host");
if(log.isDebugEnabled())
log.debug("EditSubscriptionAction: Processing " + action + " action");
User user = (User)session.getAttribute("user");
if(subscription == null && !action.equals("Create"))///create
{
if(log.isTraceEnabled())
log.trace(" No subscription for user " + user.getUsername() + " and host " + host);
return mapping.findForward("failure");
}
else //edit
--------------------
}
8 MailReader源码<struts 1.2 webapps下struts-mailreader.war并且包含说明文档,是每一个初学者和有经验的,应该要看的文章