论坛首页 Java企业应用论坛

Struts2 with logon

浏览 1895 次
该帖已经被评为隐藏帖
作者 正文
   发表时间:2007-10-03  
关于此工程中的所有设置是承接前一篇文章Struts2介绍之使用链接标签中的设置,具体文件路径设置如下图所示,开发环境JDK1.5+MyEclipse5.5+Tomcat6.0
<v:shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><v:stroke joinstyle="miter"></v:stroke><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"></v:f><v:f eqn="sum @0 1 0"></v:f><v:f eqn="sum 0 0 @1"></v:f><v:f eqn="prod @2 1 2"></v:f><v:f eqn="prod @3 21600 pixelWidth"></v:f><v:f eqn="prod @3 21600 pixelHeight"></v:f><v:f eqn="sum @0 0 1"></v:f><v:f eqn="prod @6 1 2"></v:f><v:f eqn="prod @7 21600 pixelWidth"></v:f><v:f eqn="sum @8 21600 0"></v:f><v:f eqn="prod @7 21600 pixelHeight"></v:f><v:f eqn="sum @10 21600 0"></v:f></v:formulas><v:path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></v:path><o:lock aspectratio="t" v:ext="edit"></o:lock></v:shapetype>
1Logon.jsp<o:p></o:p>
许多Web应用需要处理表单,下面我们从logon.jsp入手,看看Struts2处理表单的机制。
Logon.jsp<o:p></o:p>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
  <title>Logon</title>
</head>
<body>
<s:form action="Logon">
  <s:textfield label="User Name" name="username"/>
  <s:password label="Password" name="password" />
  <s:submit/>
</s:form>
</body>
</html>
说明:
页面中用到了struts23个标签:textfield,password,submit。大家可以“望文生义”,这里不再多说。
承接上文的struts.xml的配置(见附录1),我们在地址栏中输入:
可相应的调出Login.jsp
提示:因为这里对应struts.xml中的如下配置
<action name="*">
       <result>/example/{1}.jsp</result>
</action>
记住,这句话必须写在action声明部分的最后,如果写在前面,很有可能导致后面的action配置被忽略,因为检索到这里,就能得到正确的配置结果。
2Logon.java<o:p></o:p>
相当于struts1中的Form,我们建立Logon.java,其中有usernamepassword的设置。
Logon.java<o:p></o:p>
package example;
import com.opensymphony.xwork2.ActionSupport;
<o:p> </o:p>
public class Logon extends ActionSupport {
       private static final long serialVersionUID = <st1:chmetcnv unitname="l" sourcevalue="1" hasspace="False" negative="False" numbertype="1" tcsc="0" w:st="on">1L</st1:chmetcnv>;
       public String execute() throws Exception {
              if (isInvalid(getUsername()))
                     return INPUT;
              if (isInvalid(getPassword()))
                     return INPUT;
              return SUCCESS;
       }
       private boolean isInvalid(String value) {
              return (value == null || value.length() == 0);
       }
       private String username;
       public String getUsername() {
              return username;
       }
       public void setUsername(String username) {
              this.username = username;
       }
       private String password;
       public String getPassword() {
              return password;
       }
       public void setPassword(String password) {
              this.password = password;
       }
}
说明:
1setXXXgetXXX方法可得到和处理Login.jsp表单中的数据。
2isInvalid()方法做个简单的判断,只要usernamepassword都不为空,则返回真,否则返回假。
3execute()方法,起到跳转的作用,相当于struts1action的用途,如果isInvalid()方法返回真,则跳转到SUCCESS设置,否则跳转到INPUT设置。
4.关于SUCCESSINPUT
action(此处是Logon.java)处理完request时,它会返回相应的response。这个返回的结果可以是一个HTML页面,一个JSP页面,一个action或其他种种结果。多种结果可以被一个action mapping得到,关键是选择哪个返回结果的问题。一个action通常返回一个名字,此名字对应一个可能的返回结果。这些都需要在struts.xml中设置。看下面在struts.xml中的设置。
<action name="Logon" class="example.Logon">
  <result type="redirect-action">Menu</result>
  <result name="input">/example/Logon.jsp</result>
</action>
说明:
1<action name="Logon" class="example.Logon">
此句表明所要调用的action名与相应的类的位置。
2<result type="redirect-action">Menu</result>
此句表明默认为SUCCESS的处理结果,从type="redirect-action"可以得知,它将调用另一个名为Menuaction
3<result name="input">/example/Logon.jsp</result>
此句表明返回input的情况,它将跳转到Logon.jsp
<o:p> </o:p>
至此,对Logon.java中的两个跳转设置都在struts.xml中作了交代。下面来看看Menu这个action的定义,并引出设置存根(stub)页面的方法。
3.如何设置存根(stub)页面<o:p></o:p>
Menu.jsp<o:p></o:p>
<html>
<head><title>Missing Feature</title></head>
<body>
<p>
    This feature is under construction.
    Please try again in the next interation.
</p>
</body>
</html>
说明:
  当调用Logon这个action时,如果返回SUCCESS,则会跳转到Menu这个action,我们写一个Menu.jsp可到调出相应的页面。这是一个“缺失”页面的常规页面。我们可以将它做成可重用的形式。方法如下,我们定义一个Missing.jsp,其内容就是Menu.jsp中的内容,接着,我们修改Menu.jsp
Menu.jsp<o:p></o:p>
<%@ taglib prefix="s" uri="/struts-tags" %>
<s:include value="Missing.jsp" />
这样,就能加载Missing.jsp
4.关于验证<o:p></o:p>
验证可以通过一个XML文档来描述,也可以使用注解(关于注解annotations没有介绍)。使用xml进行验证则需将相应的文件名命名为“-validation”这种形式。我们这里使用“Logon-validation”这个名字,表明我们将验证Logon这个action
Logon-validation.xml<o:p></o:p>
<!DOCTYPE validators PUBLIC
"-//OpenSymphony Group//XWork Validator <st1:chsdate w:st="on" isrocdate="False" islunardate="False" day="30" month="12" year="1899">1.0.2</st1:chsdate>//EN"
"http://www.opensymphony.com/xwork/xwork-validator-<st1:chsdate w:st="on" isrocdate="False" islunardate="False" day="30" month="12" year="1899">1.0.2</st1:chsdate>.dtd">
<validators>
    <field name="username">
        <field-validator type="requiredstring">
            <message>Username is required</message>
        </field-validator>
    </field>
    <field name="password">
        <field-validator type="requiredstring">
            <message>Password is required</message>
        </field-validator>
    </field>
</validators>
说明:
1.为了表明是我们的xml验证发挥作用,我们将Logon.java中关于验证的部分注释掉。
//public String execute() throws Exception {
//            if (isInvalid(getUsername()))
//                   return INPUT;
//            if (isInvalid(getPassword()))
//                   return INPUT;
//            return SUCCESS;
//     }
2<field name="username">
        <field-validator type="requiredstring">
            <message>Username is required</message>
        </field-validator>
    </field>
此段说明验证的字段是username,验证的类型为requiredstring,即为空验证,如果为空则返回message: Username is required。我们看看验证结果:
3.这里有一个问题,当我们第一次调用Logon.jsp这个页面时,我们并不需要对此进行验证。我们可以这样做,我们可以利用父类ActionSupport提供的input方法来“绕过”验证。我们做如下修改:
Welcome.jsp(文件在附录2中说明)<o:p></o:p>
将:<li><a href="<s:url action="Logon"/>">Sign On</a></li>
换为:<li><a href="<s:url action="Logon_input"/>">Sign On</a></li>
<o:p> </o:p>
struts.xml<o:p></o:p>
将:<action name="Logon" class="example.Logon">
换为:<action name="Logon_*" method="{1}" class="example.Logon">
说明:
1.在Welcome.jsp页面中点击超链接Sign On,将调用Logon_input action
2.根据struts.xml中的设置,我们将处理这条配置(注意,参数input)
<action name="Logon_input" method="input" class="example.Logon">
3.在Logon类中将调用input方法(依据:method="input")。
4input方法将使得验证被绕过,并返回默认结果“input”。
5.显然,input将会再次导入Logon.jsp,此时没有验证的语句出现(指“Username is required”)。原因在于这次是直接导入jsp页面,而不是经过action导入的。
<o:p> </o:p>
下面开始进行验证了。当我们点击submit,将进行如下操作。
1.  系统检查是否有针对于目标actionLogon的验证。
2.  系统发现Logon-validation这个xml文件,系统将自动创建一个验证对象来验证这个类。
3.  开始验证输入的参数。
4.  如果验证失败,它的message将加入到一个内部的队列中。
5.  当所有的验证完成,如果验证没有通过,将返回结果“input”,并且不再返回到原Action类。
6.  当所有验证完成,如果验证通过,则返回“success”。
<o:p> </o:p>
总结,我们可以使用验证机制来代替Action类中的execute()方法。
这里简单的示范一下如何使用资源文件。下面我们定义一个资源文件。
package.properties<o:p></o:p>
requiredstring = $\{getText(fieldName)} is required.
password = Password
username = User Name
我们对Logon-validation.xmlLogon.jsp做一下修改。
Logon-validation.xml<o:p></o:p>
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics