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