分享

一个struts工程的创建过程及运行原理 - yan - JavaEye技术网站

 julie_keke 2011-01-10

一个struts工程的创建过程及运行原理

文章分类:Java编程

1 Myeclipse 中新建一个Web project,如图,点击Finish

2 右击项目名z-myfirstproject,选择Myeclipse---Add Struts Capabilities

3 在出现的如下界面中,将包名称改为自己的包名称:yan.struts,其他的默认即可,点击确定。

4 完成以上步骤后,会在项目目录中自动添加一些jar包和文件等,如图。

5 点击打开 strust-config.xml,如下,右击空白处,选择 New ---Form Action and JSP

6 在出现的Add Struts Capabilities界面中,输入user caselogin,因为要做一个登录的用例。同时可以在下面的optional Details中的form Properties中点击Add按钮添加属性。

7 这里添加两个Form表单属性,一个是username ,一个password,如下图。

 

8 如下图,选中Create JSP form选项,Superclass选择 ActionForm。点击Next

9 在出现的界面中的Optional Details中,选择Forwards,点击Add添加一个Forward

10 点击Add ,在出现的界面中填写Forward,点击Add按钮。然后在Add Struts Capabilities界面中点击finish 按钮。

11 以上操作完成后,会在项目中添加几个文件,如下图。

12 打开WebRoot目录下的form下的login.jsp页面,可以看到系统自动生成了登录页面,代码如下:

<%@ page language="java" pageEncoding="UTF-8"%>

<%@ taglib uri="http://struts./tags-bean" prefix="bean"%>

<%@ taglib uri="http://struts./tags-html" prefix="html"%>

<html>

    <head>

       <title><bean:message key="login.hello"/></title>

    </head>

    <body>

       

       <html:form action="/login.do">

           username : <html:text property="username"/><html:errors property="username"/><br/>

           password : <html:password property="password"/><html:errors property="password"/><br/>

           <html:submit/><html:cancel/>

       </html:form>

    </body>

</html>

13 src目录下的yan.struts.form目录下自动生成LoginForm.java,在该Java类中编写validate()函数,进行表单验证,它完成的功能是:如果表单中输入的username为空或者password为空,则生成表单验证错误。返回错误结果给login页面。代码如下:

public ActionErrors validate(ActionMapping mapping,

           HttpServletRequest request) {

       // TODO Auto-generated method stub

       ActionErrors errors=new ActionErrors();

       if(username==null||username.length()<1)

       {

           errors.add("username",new ActionMessage("login.error.username"));

//这里username对应的是login.jsp<html:errors property="username"/>      }

       if(password==null||password.length()<1)

       {

           errors.add("password",new ActionMessage("login.error.userpassword"));

//这里password对应的是login.jsp<html:errors property=" password "/>

       }

       return errors;

    }

当用户提交了HTML表单后,struts框架将自动把表单数据组装到ActionForm中,Actionform中的属性和HTML表单中的字段一一对应。ActionForm还提供数据验证方法,以及把属性重新设置为默认值的方法。Struts框架中定义的ActionForm类是抽象的,必须在应用中创建它的子类,来存放具体的HTML表单数据。

ActionForm实质是一种JavaBean,不过它除了具有javabean的常规方法,还有两种特殊方法:validate()用于表单验证;reset()把属性重新设置为默认值。

当用户提交了HTML表单后,struts框架会自动把表单数据组装到ActionForm中,如果在

Struts-config.xml配置文件中mapping配置中有 validate=true这一选项,则接下来struts框架会自动调用ActionFormvlidate()方法进行表单验证。如果Validate()方法返回的ActionErrors对象为null,或者不包含任何ActionMessage对象,就表示没有错误,数据验证通过。如果ActionErrors中包含ActionMessage对象,就表示发生了错误,Struts框架会把ActionErrors对象保存到request范围内,然后把请求转发到恰当的视图组件,视图组件通过

<html:errors>标签把request范围内的ActionErrors对象中包含的错误消息显示出来,提示用户修改错误。

 

14 上面的代码中用到了 new ActionMessage("login.error.username"),这里的

login.error.username 需要在ApplicaitonResources.properties中定义。

打开ApplicaitonResources.properties(它在src----yan.struts目录下)

右击 ApplicaitonResources.properties,选择Openwith ------Myeclipse Property Editor,打开编辑器,点击Add 按钮添加

 

15 打开LoginAction.java,在该类中有一个execute()方法,它完成对表单信息的业务逻辑验证以及对相关处理。编辑该方法如下:

public class LoginAction extends Action {

    public ActionForward execute(ActionMapping mapping, ActionForm form,

           HttpServletRequest request, HttpServletResponse response) {

       LoginForm loginForm = (LoginForm) form;

       String username1=loginForm.getUsername();

       String username=null;

        try {

        username=new String(username1.getBytes("ISO-8859-1"),"UTF-8");

       } catch (UnsupportedEncodingException e) {

           e.printStackTrace();

       }

       //以上将form表单中获得用户名转换为UTF-8格式。

       String password=loginForm.getPassword();

       ActionMessages errors=new ActionMessages();

       String badusername="admin";

       String badpassword="123456";

       if(username.equals(badusername))

       {

           errors.add("username",new ActionMessage("login.error.badusername",badusername));

           //如果用户名验证失败,将ActionMessage对象保存到ActionMessages对象errors中。

           //login.error.badusername对应消息资源文件中的login.error.badusername的值。

           saveErrors(request,errors);

           //保存ActionMessages对象errorsrequest范围。

           return new ActionForward(mapping.getInput());

           //返回ActionForward对象,Struts框架会把请求转发到视图组件login.jsp中,通过来显示错误信息。

       }

       if(password.equals(badpassword))

       {

           errors.add("password",new ActionMessage("login.error.badpassword",badpassword));

           saveErrors(request,errors);

           return new ActionForward(mapping.getInput());

       }

       request.setAttribute("username",username);

       request.setAttribute("password",password);

       //usernamepassword的值存入request范围内,可以传递到下一页面。

       return mapping.findForward("login-success");//返回下一页面,login-success对应struts-config.xml<forward>属性

    }

}

所有的Action类都是org.apache.struts.action.Action的子类,Action子类应该覆盖父类的execute()方法,当ActionForm被创建,并且表单验证顺利通过后,struts框架就会调用Action类的execute()方法,该方法的包含如下参数:

ActionMapping:包含了这个Action的配置信息,和struts-config.xml文件中的<action>元素对应。

ActionForm:包含了用户的表单数据,当struts框架调用execute()方法时,ActionForm中的数据已经通过了表单验证。

HttpServletRequest:当前的HTTP请求对象。

HttpServletResponse:当前的Http相应对象。

16 WebRoot下新建success.jsp文件,代码如下:

<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
转藏 分享 献花(0

0条评论

发表

请遵守用户 评论公约

类似文章 更多