之前在跟着老师们做项目的时候经常会烦恼Struts.xml怎么配置,老师也没讲太清楚,都是说很简单,但是不懂的人就是太难了!哈哈,万事还是要靠自己的!

struts.xml今天又看了几个小时的书,也跟着做了一个登陆的实例,这个实例有两个版本,一个是使用JavaBean当Model,一个是使用Action属性当Model,其实简单的使用Action的属性就行了,但是考虑到以后项目的发展和耦合消除,还是推荐中大型项目一开始就使用JavaBean,或者成为Domain来做Model。

这个实例涉及到了多页面了,比之前的HW实例要复杂一点点,也就是说不会仅仅返回一个String值了,配置文件会根据返回的值来选择处理的动作,或跳转或转为其他页面处理。来看一下struts.xml的代码:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd"> <struts>
<package name="default" namespace="/" extends="struts-default">
<action name="loginAction_*" class="tech.youngs.Action.LoginAction" method="{1}">
<result name="input">/WEB-INF/jsp/login.jsp</result>
<result name="success">/WEB-INF/jsp/success.jsp</result>
<result name="error">/WEB-INF/jsp/error.jsp</result>
</action>
</package>
<!-- Add packages here -->
</struts>
<action name="loginAction_*" class="tech.youngs.Action.LoginAction" method="{1}">这句代码要着重的Mark一下,这里使用了‘*’这个通配符,这个*的值是根据URL来确定的,
如果URL是localhost:8080/struts/loginAction_login,那么*的值就是login,后面的method的{1}代表引用*的值,花括号里面的数字代表引用第几个星号的值,这样做起来非常方便,避免
了在struts中重复定义许多action,减少了代码冗余。
还要在说一下这个method属性,之前看书里面的代码都是method=“execute”,实际上,这定义了这个action需要执行的类内的哪一个方法,你可以随便指定对应类内的方法,如果不指定则默认为
execute。那么也就是说如果URL是localhost:8080/struts/loginAction_login,那么他实际上调用了LoginAction里面的login方法。
在来看一下LoginAction.java文件代码:
package tech.youngs.Action;

import com.opensymphony.xwork2.ActionSupport;

public class LoginAction extends ActionSupport{
private static final long serialVersionUID = 1L;
private String username;
private String password; public String getUsername() {
return username;
} public void setUsername(String username) {
this.username = username;
} public String getPassword() {
return password;
} public void setPassword(String password) {
this.password = password;
} public String login()
{
return INPUT;
}
public String process()
{
if("youngs".equals(username) && "996225".equals(password))
{
return SUCCESS;
}else{
return ERROR;
}
}
}

这个Action类继承了ActionSupport,这个里面定义了几个常量:SUCCESS/ERROR/INPUT还有几个用到了在继续补充,这统一定义了返回的String值,规范化了很多。

最主要的是process方法,里面直接判断了传入的值是否和预定值相同,我们直接使用属性就行了,struts已经帮我们赋好了值。

还有一种实现的思路,是我比较认同的,我在手机上看的书上却不这么认同。。。搞不太清楚他的思路——就是使用JavaBean来当做Model,而不是使用Action内的属性。这样做的好处有很多,主要是为了分清楚层次关系以及解耦合。

将上面的属性分离出去,新建一个JavaBean类:

package tech.youngs.Domain;

public class LoginModel{
private String username;
private String password; public String getUsername() {
return username;
} public void setUsername(String username) {
this.username = username;
} public String getPassword() {
return password;
} public void setPassword(String password) {
this.password = password;
}
}

此时还需要对Action做一点点变动,Action除了需要继承ActionSupport意外,还需要实现ModelDriven<T>接口。在ModelDriven里面包含一个方法,getModel()用于返回

Model实例,这里的实例在Action的属性里面进行实例化,声明为private类型。代码如下:

package tech.youngs.Action;

import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven; import tech.youngs.Domain.LoginModel; public class LoginAction extends ActionSupport implements ModelDriven<LoginModel>{
private static final long serialVersionUID = 1L;
private LoginModel model = new LoginModel();
// private String username;
// private String password;
//
// public String getUsername() {
// return username;
// }
//
// public void setUsername(String username) {
// this.username = username;
// }
//
// public String getPassword() {
// return password;
// }
//
// public void setPassword(String password) {
// this.password = password;
// } public String login()
{
return INPUT;
}
public String process()
{
if("youngs".equals(model.getUsername()) && "996225".equals(model.getPassword()))
{
return SUCCESS;
}else{
return ERROR;
}
}
@Override
public LoginModel getModel() {
// TODO Auto-generated method stub
return model;
}
}

我倒是觉得这种代码的编写方式很好,起码很清楚,以后维护起来也很方便。

Struts2学习笔记②的更多相关文章

  1. Struts2学习笔记⑧

    今天是Struts2学习笔记的最后一篇文章了.用什么做结尾呢,这两天其实还学了很多东西,没有记录下,今天就查漏补缺一下. 文件上传与下载.FreeMarker以及昨天没做完的例子 文件上传与下载 文件 ...

  2. Struts2学习笔记①

    Struts2 学习笔记① 所有的程序学习都从Hello World开始,今天先跟着书做一个HW的示例. Struts2是一套MVC框架,使用起来非常方便,接触到现在觉得最麻烦的地方是配置文件.我的一 ...

  3. Struts2学习笔记NO.1------结合Hibernate完成查询商品类别简单案例(工具IDEA)

    Struts2学习笔记一结合Hibernate完成查询商品类别简单案例(工具IDEA) 1.jar包准备 Hibernate+Struts2 jar包 struts的jar比较多,可以从Struts官 ...

  4. Struts2 学习笔记(概述)

    Struts2 学习笔记 2015年3月7日11:02:55 MVC思想 Strust2的MVC对应关系如下: 在MVC三个模块当中,struts2对应关系如下: Model: 负责封装应用的状态,并 ...

  5. struts2学习笔记 ⑤

    拦截器初探 昨天临睡觉之前看了看拦截器,也在昨天的学习笔记里面胡诌诌了几句,今天就来好好的会会拦截器这个东西.实际上拦截器是一种模块实现的机制<起码我是这么体会的>(至于说书里面说体现了A ...

  6. [struts2学习笔记] 第二节 使用Maven搞定管理和构造Struts 2 Web应用程序的七个步骤

    本文地址:http://blog.csdn.net/sushengmiyan/article/details/40303897 官方文档:http://struts.apache.org/releas ...

  7. struts2学习笔记之二:基本环境搭建

    学习struts2有一段时间了,作为一个运维人员学习的时间还是挺紧张的,写这篇文件为了方便以后复习时使用 环境: MyEclipse 10 tomcat6 jdk1.6   首先建立一个web项目,并 ...

  8. 【Struts2学习笔记-4】包含其他配置文件

    包含其他配置文件 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLI ...

  9. 【Struts2学习笔记-3】常量配置

    Struts2常量 配置Struts2常量值有3个地方,1)在struts.properties文件中配置常量:2)在web.xml文件中配置FileterDispatcher指定初始化参数来配置常量 ...

  10. struts2学习笔记(4)——数据类型转换

    回过头来看昨天的那个例子. 在昨天的例子中,只转换了一个Point类,如果想转换多个Point类怎么办呢?在昨天的例子上面做一个小的修改. 首先在input.jsp页面中修改几个输入框. <s: ...

随机推荐

  1. react中常用的一些方法

    React.createClass:创建一个ReactClass(组件类),参数是一个对象且必须带有 render 属性方法,该方法必须返回一个封闭的容器(容器内可以有其它不限结构的容器)或 null ...

  2. WPF ResourceDictionary的使用

    作用:一个应用程序中,某个窗口需要使用样式,但是样式非常多,写在一个窗口中代码分类不方便.最好Style写在专门的xaml文件中,然后引用到窗口中,就像HTML引用外部css文件一样. 初衷:就在于可 ...

  3. jQuery 对象与Dom 对象互转

    jQuery 对象与Dom 对象互转: $obj --[i],get(i)-->obj --$(obj)-->$obj; obj--$($(obj))-->$obj,多包装了也是$o ...

  4. 在Flex中用于处理XML对象的E4X 方法

    ECMAScript for XML 规范定义了一组用于使用 XML 数据的类和功能.这些类和功能统称为 E4X.ActionScript 3.0 包含以下 E4X 类:XML.XMLList.QNa ...

  5. SVG六基本元素

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. Redis缓存数据之简单逻辑

    并发不高的情况: 读: 读redis->没有,读DataBase->把DB数据写回redis,有的话直接从redis中取: 写: 写DataBase->成功,再写redis: 并发高 ...

  7. 纯CSS3实现不错的表单验证效果

    这是补充HTML5基础知识的系列内容,其他为: 一.HTML5-- 新的结构元素 二.HTML5-- figure.time.details.mark 三.HTML5-- details活学活用 四. ...

  8. Bootstrap入门(五)表单

    Bootstrap入门(五)表单   先引入本地的CSS文件  <link href="css/bootstrap.min.css" rel="stylesheet ...

  9. MyBatis中多对多关系的映射和查询

    先说一下需求: 在页面上显示数据库中的所有图书,显示图书的同时,显示出该图书所属的类别(这里一本书可能同时属于多个类别) 创建表: 笔者这里使用 中间表 连接 图书表 和 图书类别表,图书表中 没有使 ...

  10. iOS实现白板、画板功能,有趣的涂鸦工具,已封装,简单快捷使用

    一.效果图: 二.选择颜色: 分[固定颜色模式]和[自由取模式].  三.操作栏功能: 1.撤销:撤销上一步操作,可一直往上进行,直到全部清空. 2.清空:直接清除所有绘画. 3.橡皮擦:去除不要的绘 ...