越来越发现, 2.0比1.x方便了, 具体怎么方便, 看完你就知道了.呵呵.
首先是欢迎页面, 这个页面没什么东西, 只是一个进入登录页面的链接而已.
看好了链接是怎么写的哦, 下面会做讲解的, 虽然action写的是login!input, 但其实进入的是login这个Action.呵呵, 为什么? 等写到下面一起说.
接下来就是登录页面啦.
在这里面用了三个Struts的标签, 而且很好懂, 不做解释啦, 只不过要注意一下s:textfield和s:password里的label属性, 是个特殊的写法哦, 作用呢, 就是根据所传的参数做为Key, 到资源文件中取相应的内容.
下面就是Action啦. 这个也很好懂的, 和上一篇的HelloWorld基本一样.
别的没什么好说的, 只提一下Execute方法内的两个不同的反回值, 在HelloWorld里面, Struts的配置文件中的Action的返回页面, 只是用了一个默认的值, 也就是SUCCESS代表的返回值, 在这个里面多了一个INPUT, 类似于1.x配置文件里的input, 只不过在2.0里单拿出来了. 其实加上了Validator验证之后, 这一步就是多余的了, 你可以在不加Validator的情况下, 看看这样返回会是什么样子.
下面就是struts.xml的配置啦.
这里定义了两个result, 当在Action的返回SUCCESS的时候, 会走默认的result, 也就是上面的 < result type ="redirect-action" > menu </ result >, 注意里面的type, 是来设置跳转的类型的, 设置为Redirect, 在跳转之后, 浏览器上会显示跳转之后的地址, 否则还会显示当前的地址.我想Redirect和Forward的区别, 大家应该都很清楚了. 里面的menu, 用的是下面特殊的Action定义的, 转到了menu.jsp页面.
这个Action的定义, 也和HelloWorld里不太一样哦.还记得上面的链接地址吧? 它是怎么工作的呢? 其实是这样的.
首先框架会先寻找login!*这个Action, 之后把method="{1}"替换成"method=input", 框架会调用Login这个Action中的input方法, 而input方法是一个特殊的方法, 在执行这个方法的时候, 框架是不会去执行验证的, 默认的input方法会返回一个INPUT, 指向我们定义的result, 这样在显示JSP页面的时候, 就不会带上错误消息了, 否则第一次见到页面, 上面就有错误提示, 会让人感觉很别扭. (英文太烂, 只能理解到这程度了, 有什么问题希望给指出, 先谢谢撒!)
在这里还要提一个特殊的Action:
用这样的配置, 当你输入一个地址, 比如是:Welcome.action的时候, 首先他会到struts.xml里面去找有没有Welcome这个Action, 没有的话就匹配上这个*的了, 会把我们输入的Action地址做为一个参数, 传给/{1}.jsp, 这样得到的结果就是Welcome.jsp啦.呵呵, 是不是很好用呢? 不过要把它放在最后, 否则会有问题, 你可以试试着, 把它放在Login的Action的上面, 看看会有什么问题.呵.
接下来就是验证文件啦, 跟1.x相似, 还是在XML文件里面写, 但是还有区别, 在这里针对Login的验证可以在Action的类文件的相同目录, 定义一个以类名开头+"-validation.xml", 这样就不会把一堆验证扔到一起了, 可以单独拿来写.
在这里的Message都是写的资源文件里面的Key值, 下面就是资源文件的定义, 跟1.x里是一样的.
可以直接用 ${getText(fieldName)}方法, 从资源文件中取其他的内容, 很方便不是嘛?
但是如果是通过匹配 * 这个Action跟转的页面, 是没法来读取资源文件的, 至少我现在还不会.呵呵.
但是可以改一下那个Action的定义.
改成:
给它加了一个Class, 这个Class随便写一个空的类就可以了.
这样.就可以在menu.jsp页面里引用资源文件啦.
现在最后一个页面也完成了, 把Tomcat启动起来, 看看我们的成果吧!!!
感觉用起来还是蛮舒服的. 呵呵.继续~~~
首先是欢迎页面, 这个页面没什么东西, 只是一个进入登录页面的链接而已.
<%
@ taglib prefix="s" uri="/struts-tags"
%>
< html >
< head >
< title > Index </ title >
</ head >
< body >
< a href ="<s:url action=" login!input" /> ">Login </ a >< br />
</ body >
</ html >
< html >
< head >
< title > Index </ title >
</ head >
< body >
< a href ="<s:url action=" login!input" /> ">Login </ a >< br />
</ body >
</ html >
看好了链接是怎么写的哦, 下面会做讲解的, 虽然action写的是login!input, 但其实进入的是login这个Action.呵呵, 为什么? 等写到下面一起说.
接下来就是登录页面啦.
<%
@ page contentType="text/html; charset=UTF-8"
%>
<% @ taglib prefix="s" uri="/struts-tags" %>
< html >
< head >
< title > Login </ title >
</ head >
< body >
< s:form action ="login" >
< s:textfield label ="%{getText('username')}" name ="username" />
< s:password label ="%{getText('password')}" name ="password" />
< s:submit />
</ s:form >
</ body >
</ html >
<% @ taglib prefix="s" uri="/struts-tags" %>
< html >
< head >
< title > Login </ title >
</ head >
< body >
< s:form action ="login" >
< s:textfield label ="%{getText('username')}" name ="username" />
< s:password label ="%{getText('password')}" name ="password" />
< s:submit />
</ s:form >
</ body >
</ html >
在这里面用了三个Struts的标签, 而且很好懂, 不做解释啦, 只不过要注意一下s:textfield和s:password里的label属性, 是个特殊的写法哦, 作用呢, 就是根据所传的参数做为Key, 到资源文件中取相应的内容.
下面就是Action啦. 这个也很好懂的, 和上一篇的HelloWorld基本一样.
package
com.puras.struts2;
import com.opensymphony.xwork2.ActionSupport;
public class Login extends ActionSupport {
private String username;
private String password;
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String execute() throws Exception {
if (isInvalid(getUsername())) return INPUT;
if (isInvalid(getPassword())) return INPUT;
return SUCCESS;
}
public boolean isInvalid(String value) {
return (value == null || value.length() == 0);
}
}
import com.opensymphony.xwork2.ActionSupport;
public class Login extends ActionSupport {
private String username;
private String password;
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String execute() throws Exception {
if (isInvalid(getUsername())) return INPUT;
if (isInvalid(getPassword())) return INPUT;
return SUCCESS;
}
public boolean isInvalid(String value) {
return (value == null || value.length() == 0);
}
}
别的没什么好说的, 只提一下Execute方法内的两个不同的反回值, 在HelloWorld里面, Struts的配置文件中的Action的返回页面, 只是用了一个默认的值, 也就是SUCCESS代表的返回值, 在这个里面多了一个INPUT, 类似于1.x配置文件里的input, 只不过在2.0里单拿出来了. 其实加上了Validator验证之后, 这一步就是多余的了, 你可以在不加Validator的情况下, 看看这样返回会是什么样子.
下面就是struts.xml的配置啦.
<
action
name
="login!*"
method
="{1}"
class
="com.puras.struts2.Login"
>
< result type ="redirect-action" > menu </ result >
< result name ="input" > /login.jsp </ result >
</ action >
< result type ="redirect-action" > menu </ result >
< result name ="input" > /login.jsp </ result >
</ action >
这里定义了两个result, 当在Action的返回SUCCESS的时候, 会走默认的result, 也就是上面的 < result type ="redirect-action" > menu </ result >, 注意里面的type, 是来设置跳转的类型的, 设置为Redirect, 在跳转之后, 浏览器上会显示跳转之后的地址, 否则还会显示当前的地址.我想Redirect和Forward的区别, 大家应该都很清楚了. 里面的menu, 用的是下面特殊的Action定义的, 转到了menu.jsp页面.
这个Action的定义, 也和HelloWorld里不太一样哦.还记得上面的链接地址吧? 它是怎么工作的呢? 其实是这样的.
首先框架会先寻找login!*这个Action, 之后把method="{1}"替换成"method=input", 框架会调用Login这个Action中的input方法, 而input方法是一个特殊的方法, 在执行这个方法的时候, 框架是不会去执行验证的, 默认的input方法会返回一个INPUT, 指向我们定义的result, 这样在显示JSP页面的时候, 就不会带上错误消息了, 否则第一次见到页面, 上面就有错误提示, 会让人感觉很别扭. (英文太烂, 只能理解到这程度了, 有什么问题希望给指出, 先谢谢撒!)
在这里还要提一个特殊的Action:
<
action
name
="*"
>
<result>/{1}.jsp</result>
</action>
<result>/{1}.jsp</result>
</action>
用这样的配置, 当你输入一个地址, 比如是:Welcome.action的时候, 首先他会到struts.xml里面去找有没有Welcome这个Action, 没有的话就匹配上这个*的了, 会把我们输入的Action地址做为一个参数, 传给/{1}.jsp, 这样得到的结果就是Welcome.jsp啦.呵呵, 是不是很好用呢? 不过要把它放在最后, 否则会有问题, 你可以试试着, 把它放在Login的Action的上面, 看看会有什么问题.呵.
接下来就是验证文件啦, 跟1.x相似, 还是在XML文件里面写, 但是还有区别, 在这里针对Login的验证可以在Action的类文件的相同目录, 定义一个以类名开头+"-validation.xml", 这样就不会把一堆验证扔到一起了, 可以单独拿来写.
<!
DOCTYPE validators PUBLIC
"-//OpenSymphony Group//XWork Validator 1.0.2//EN"
"http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd" >
< validators >
< field name ="username" >
< field-validator type ="requiredstring" >
< message key ="requiredstring" />
</ field-validator >
</ field >
< field name ="password" >
< field-validator type ="requiredstring" >
< message key ="requiredstring" />
</ field-validator >
</ field >
</ validators >
"-//OpenSymphony Group//XWork Validator 1.0.2//EN"
"http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd" >
< validators >
< field name ="username" >
< field-validator type ="requiredstring" >
< message key ="requiredstring" />
</ field-validator >
</ field >
< field name ="password" >
< field-validator type ="requiredstring" >
< message key ="requiredstring" />
</ field-validator >
</ field >
</ validators >
在这里的Message都是写的资源文件里面的Key值, 下面就是资源文件的定义, 跟1.x里是一样的.
requiredstring=${getText(fieldName)} is required!
username = User Name
password = Password
username = User Name
password = Password
可以直接用 ${getText(fieldName)}方法, 从资源文件中取其他的内容, 很方便不是嘛?
但是如果是通过匹配 * 这个Action跟转的页面, 是没法来读取资源文件的, 至少我现在还不会.呵呵.
但是可以改一下那个Action的定义.
改成:
<
action
name
="*"
class
="com.puras.struts2.ExampleSupport"
>
< result > /{1}.jsp </ result >
</ action >
< result > /{1}.jsp </ result >
</ action >
给它加了一个Class, 这个Class随便写一个空的类就可以了.
package
com.puras.struts2;
import com.opensymphony.xwork2.ActionSupport;
public class ExampleSupport extends ActionSupport {
}
import com.opensymphony.xwork2.ActionSupport;
public class ExampleSupport extends ActionSupport {
}
这样.就可以在menu.jsp页面里引用资源文件啦.
<%
@ page contentType="text/html; charset=UTF-8"
%>
<% @ taglib prefix="s" uri="/struts-tags" %>
< html >
< head >
< title > The First Struts 2.0 Example </ title >
</ head >
< body >
< h2 >< s:text name ="Menu.message" /></ h2 >
</ body >
</ html >
<% @ taglib prefix="s" uri="/struts-tags" %>
< html >
< head >
< title > The First Struts 2.0 Example </ title >
</ head >
< body >
< h2 >< s:text name ="Menu.message" /></ h2 >
</ body >
</ html >
现在最后一个页面也完成了, 把Tomcat启动起来, 看看我们的成果吧!!!
感觉用起来还是蛮舒服的. 呵呵.继续~~~