我的第一个Struts程序

    终于要开始本人的第一个Struts程序了,虽然在这之前或多或少知道一些,但是都没有认真去尝试,这一回我是要彻底弄清楚它了。我是用MyEclipe做的,原因是它集成插件

的能力非常好,这样可以省不少事了。
    (1)在MyEclipse下创建工程,因为Struts框架主要用于开发Web Project,并且它是属于J2EE系列,所以要选择"MyEclipse”-->"J2EE Projects”-->"Web Project"类型,

如果不是这样的话,Struts程序不会运行哦。系统会自动为你的项目加载J2ee基本包 。
   (2)第二步要做的就是为该项目添加Struts包,在"MyEclipe"菜单下选择"add struts capabilities",MyEclipse接着会为你启动一个Struts sSupport for MyEcliplse Web

Project向导,这里可以配置Struts配置文件路径及名字。你所创建类的包并且它会自动把那个国际化文件放在你这个包的根目录下。
  (3)我们要做的这个实例非常简单,就是完成简单的用户身份合法性判断。用户通过我们提供的操作界面输入其姓名及密码(我们这里要求是"lll”和"aaa"),如果合法则输

出欢迎词,否则返回,并提示出错原因。首先我们要创建一个用户请求获取页面,这是一个包含了Struts标签的JSP文件。我们定义了两个JSP,一个是login.jsp用于获取用户登录

请求,一个是登录成功后跳转的success.jsp。login.jsp代码如下:
  
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<HTML>
  <HEAD>
     <TITLE><bean:message key="login.jsp.title"/></TITLE>
     <html:base/>
  </HEAD>
  <BODY>
  <h3><bean:message key="login.jsp.page.heading"/></h3><html:errors/>
  <html:form action="loginAction.do" focus="username">
  <TABLE border="0" width="100%">
    <TR><TH align="right"><bean:message key="login.jsp.prompt.username"/></TH>
      <TD align="left"><html:text property="username"/></TD></TR>
    <TR><TH align="right"><bean:message key="login.jsp.prompt.password"/></TH>
    <TD align="left"><html:password property="password"/></TD></TR>
    <TR><TD align="right"><html:submit><bean:message key="login.jsp.prompt.submit"/></html:submit></TD>
        <TD align="left"><html:reset><bean:message key="login.jsp.prompt.reset"/></html:reset></TD></TR>
  </TABLE>
  </html:form>
  </BODY>
  </HTML>

    其中<taglib>的内容为要引用的Struts标签库内容以及该库内容的前缀信息。我们需要在该主页里面显示用户名标签及用户名文本框,密码标签以及密码文本框。注意相应请

求信息包含在<html:form>表单里,这里不能使用传统hmtl的<form>标签,否则用户的相应请求Struts会收不到。一般用户请求都会提交给带后缀.do的action对象去处理,注意这

里的action对象只是一个名称而已,它不是实际的Action对象。
   文本框的定义与传统html文本框定义的也不一样,它不但要用html:text,而且还要定义property属性内容,而这个属性将会与你所定义的JSP页面的ActionForm实例对象中的特

定属性对应。
   在这里我们还会看到<bean:message>标签,它的意思是要从ApplicationResource.properties文件中取出带相应key的信息进行显示。如何正常显示中文提示,我们在后面会提

到。
  (4)下面我们首先要定义我们的struts-config.xml文件,它在web-inf目录下。这是一个非常重要的文件,Struts框架就靠读取它来确定用户请求的转发已经用户请求对应的

ActionForm对象。我们的Struts-Config.xml文件内容如下:
引用
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN"
"http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">
<struts-config>
  <data-sources />
  <form-beans>
    <form-bean name="userInfoForm" type="com.test.UserInfoForm"/>
  </form-beans>
  <global-exceptions />
  <global-forwards />
  <action-mappings>
     <action input="/login.jsp" name="userInfoForm" path="/loginAction" scope="session"
     type="com.test.LoginAction" validate="false">
     <forward name="success" path="/success.jsp"/>
     </action>
  </action-mappings>
  <message-resources parameter="com.test.ApplicationResources" />
</struts-config>

  这里我们需要在<action-mappings>下面定义<action>标签,以说明相应Action对象处理来自何处的请求,并且将相应用户的请求封装到那个ActionForm对象中,以便以后可以随

时更新ActionForm对象数据并显示,使得显示最新数据。<forward>说明该Action对象在获取跳转名称为success时跳转的位置。注意<action>标签里文件路径的引用,最前面都要

加/,否则会报错。报错信息会后面说明。注意在<action>标签里定义的name属性是一个ActionForm类的实例。我这里定义的是userInforForm,用来在用户管理中重用的,所以起

了这个名,你要一个jsp对应一个FormBean也是可以的,但是FormBean就会多了。
  从上面的配置文件可以看出,用户从login.jsp提交给loginAction请求的组件信息会与相应FormBean的属性对应上,并提交给com.test.LoginAction类的实例完成处理。当处理

完毕进行跳转时,如果提示信息是success,则跳转到success.jsp,否则仍然跳回login.jsp(这是在LoginAction代码中定义的)。这样的好处是将页面流转清晰化、可配置化。
   (5)下面编写userInfoForm类,代码如下:
  
package com.test;
import org.apache.struts.action.*;
import javax.servlet.http.HttpServletRequest;
public class UserInfoForm extends ActionForm{
	private String username;
	private String password;
	public String getUsername(){return this.username;}
	public void setUsername(String username){this.username = username;}
	public String getPassword(){return (this.password);}
	public void setPassword(String password) {this.password = password;}
	}

   Struts的Form Bean都必须继承ActionForm类,其它的就是一个标准的JavaBean。
  (6)LoginAction.java代码如下:
  
package com.test;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionError;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionServlet;
public final class LoginAction extends Action
{
	public ActionForward execute(ActionMapping mapping,ActionForm form,HttpServletRequest request,
			HttpServletResponse response) throws IOException,ServletException
	{
		UserInfoForm loginInfoForm=(UserInfoForm)form;
		String username = loginInfoForm.getUsername().trim();
		String password=loginInfoForm.getPassword().trim();
		ActionErrors errors = new ActionErrors();
        if(username.equals("")){
        	ActionError error=new ActionError("error.missing.username");
        	errors.add(ActionErrors.GLOBAL_ERROR,error);
        	}
	    if(password.equals("")){
	    	ActionError error=new ActionError("error.missing.password");
	    	errors.add(ActionErrors.GLOBAL_ERROR,error);
	    }
	    if (errors.size()==0)
	    	{
	    	try{
                if (username.equals("lll") && password.equals("aaa"))
	    			return mapping.findForward("success");
                else
                {
                	ActionError error=new ActionError("error.wrong.userinfo");
                	errors.add(ActionErrors.GLOBAL_ERROR,error);
                }
	    	}catch(Throwable e){
	          e.printStackTrace();
	          ActionError error=new ActionError(e.getMessage());
	          errors.add(ActionErrors.GLOBAL_ERROR,error);
	          }
	}
	  saveErrors(request, errors);
	  return new ActionForward(mapping.getInput());
	}
	}

      所有的Action对象都要继承Action类,并重载其execute方法。该方法带了四个参数,分别为ActionMapping,ActionForm,HttpServletRequest,HttpServletResponse类型,

并且返回类型为ActionForward对象。在这里补充了出错提示,首先需要将特定情况下的错误信息存。放到ActionErrors对象里(当然是先生成ActionError对象,然后再放进去)

。login.jsp中<html:errors/>完成相应错误信息的提示。注意生成ActionError对象的字符串只是一个Key信息,需要到ApplicationResource.properties中去找其value信息,这

样你就可以任意发挥了啊。而且一定要将错误对象存储到HttpServletRequest对象中去,否则不会显示哦~~~
  (7)最后我们还要补充ApplicationResource.properties文件的内容,内容如下:
引用
# Resources for parameter 'com.yourcompany.struts.ApplicationResources'
# Project testStruts
#Application Resource for the login.jsp
  login.jsp.title=The login page
  login.jsp.page.heading=Welcome World!
  login.jsp.prompt.username=Username:
  login.jsp.prompt.password=Password:
  login.jsp.prompt.submit=Submit
  login.jsp.prompt.reset=Reset

#Application Resource for the success.jsp
   success.jsp.title=The main page
   success.jsp.welcome=Welcome:

#Application Resource for the LoginAction.java
   error.missing.username=<li><font color="red">missing username</font></li>
   error.missing.password=<li><font color="red">missing password</font></li>

error.wrong.userinfo=<li><font color="red">username or password is wrong</font></li>
  这些都是相应文件所需要的国际化信息,这里暂时不允许输入中文(后面会说明如何处理)。
  (8)现在先来调试一下,看有什么问题没有。启动Web服务器,并将该项目配置到服务器中。用户登录主页进入正常。用户信息输入“lll”,密码输入“aaa”,结果返回”The

requested resource (/success.jsp) is not available“的错误提示。首先说明LoginAction处理正常,再一看是success.jsp内容忘记定义了,其内容如下:
引用
<%@ page contentType="text/html; charset=GB2312" %>
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>
<HTML>
<HEAD>
  <TITLE><bean:message key="success.jsp.title"/></TITLE></html:base></HEAD>
  <BODY>
   <logic:present name="userInfoForm">
   <H3>
     <bean:message key="success.jsp.welcome"/>
     <bean:write name="userInfoForm" property="username"/>!</H3></logic:present>
  </BODY>
</HTML>

这里要显示从FormBean取出来的信息,因此要用到struts-logic.tld标签库,只要在要显示的地方用<bean:write>标签,并给出要显示的FormBean及属性名称property即可。

<logic:present>用来判断相应FormBean实例对象是否存在。重新配置该项目,重新运行,通过。再用用户名为空,密码为空,或输入错误的用户名和密码,都得到了预期的效果。

你可能感兴趣的:(apache,jsp,struts,servlet,MyEclipse)