struts经验总结

struts经验总结

1          结构

1.1                  总体结构

Struts理论上由3个文件Jsp,action类,form类。其中,form类继承了ActionForm,主要是set,get等方法,还有resetvalidate方法(),,form类不属于控制层,所以不进行业务逻辑的处理。他的功能就是提供一个控制层与页面对话的一个窗口,以便让控制层与视图层沟通。一个form类对应页面一个表单。

action类(C层)继承了Action则为主要的类,必须覆盖excute方法,原类的此方法返回null.动作流程在这里编写,一般将逻辑封装在beanM层)中,由action来调用,这样可使逻辑变得清晰。一个action对应一个(或多个)动作(比如提交,link.

1.1.1           流程:

1.1.1.1      本例jsp页为action="/HelloWorld.do"。则web.xml中寻找属性为*.do的元素

1.1.1.2      按照的名称action找到对应的

1.1.1.3      Servlet按照用户请求action="/HelloWorld.do",config.xml中检索path"/HelloWorld.do"

1.1.1.4      ActionServlet根据name属性创建一个HelloForm对象,将表单数据提交给对象,并且将对象保存在scope指定的范围内。

1.1.1.5      如果validate属性为true,则执行ActionFormvalidate方法。

1.1.1.6      如果验证失败,则validate方法将ActionErrors对象保存在scope范围内,根据属性,页面跳转。<html:errors />负责读取ActionErrors对象,显示出来。

1.1.1.7      验证成功则返回的ActionErrors中不包含任何ActionMessage对象,然后开始创建Action对象,调用其execute()方法。

1.1.2                         使用方法

1.1.2.1   bean

jsp中使用

<logic:present name="HelloForm" scope="request">

判断request中叫HelloFormbean是否存在,如果存在,

<bean:write     name="HelloForm" property="userName" />

1.1.3                         actionForm

属于视图组件,提交表单后,struts自动将表单数据提交给actionForm Bean中,此类的方法包括,jsp页请求的set,getreset,validate方法。Struts首先运行reset方法来重新设置默认值,然后运行validate,进行表单验证,如果发生错误,则创建ActionErrors实例,使用add(“username”,new ActionMessage(“”))方法添加错误,在return实例。如果发生错误,负责将保存在request中的ActionErrors的错误表示出来。

一个画面原则上应该对应一个form,当迁移的时候,Action类中可以使用多个form,一个为本form,其他为迁移先或者迁移元,而迁移先画面则使用自己的form,这样可以避免一个画面使用多个form,但是form的判断能力(validate)可能受到了限制(还有待考察)。

      

1.1.4           Action

1.1.4.1   取得属性

mapping.getInput()得到中的input属性.

1.1.4.2   画面迁移

return (mapping.findForward("SayHello"))返回目标网页

1.1.4.3                  改变请求,与网页进行交互

   Action类中,可以实体化ActionForm,然后设置其属性,例:

   FormBasicForm fbf = (FormBasicForm) form;

   fbf.setName(“dzp”);

   达到改变请求的目的,而由于页面使用了struts标签,所以自动从名称相同的请求中取得数据.此外,不同控件可以使用相同的property,从而达到一个请求对应多个控件的目的。

 

1.2                  配置文件

1.2.1                         config.xml

        

                name="RegisterForm" type="app.RegisterForm">

               

       

        这里type指向了form类,而name则为他定义了一个名字

       

                path="/test" type="app.RegisterAction"

                name="RegisterForm" scope="request" input="/register.jsp">

                        name="success" path="/success.jsp">

                       

                        name="failure" path="/failure.jsp">

                       

               

       

    这里path标示了这个action的代号,和jsp中的"/test.do">名称相同.

type指向了action类。

name对应了form类。

scope指范围。

input指的是错误信息(ActionErrors )输出页面,当Form类中validate方法returnerrors不为空时,将转向input所指页面,以输出错误信息。

     

        name="HelloForm" type="hello.HelloForm"/>

   

 

        path      = "/HelloWorld"

               type      = "hello.HelloAction"

               name      = "HelloForm"

               scope     = "request"

               validate  = "true"

               input     = "/hello.jsp">

        name="SayHello" path="/hello.jsp" />

   

 

  parameter="hello.application"/>

     配置了ActionForm Bean

   pathjsp页引用action类时所要调用的名称。Typeaction本身。NameActionForm类名,种对应的ActionForm名相同scope存在范围。Validate是否执行表单验证。Input为验证失败时的转发路径。

     message-resourcesresource Bundle使用的消息资源文件,本例为hello包下的application.properties文件。

1.3                  乱码

1.3.1  Jsp页面上的乱码问题,表现为,使用eclipse时,jsp页面上的文字,经常突然变为乱码,原因为eclipse的编译方式默认的ms932,改成Other(UTF-8),则解决。Windows - Preference - General - Workspace - Text file encoding

1.3.2  Request中日文乱码,表现为,页面中传到formActionrequest为乱码,即使在formAction中处理也无效。

     解决方法:加过滤器

     创建Trans.java 进行过滤

package common;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.RequestProcessor;

public class Trans extends RequestProcessor{

  public Trans(){}

  protected boolean processPreprocess( HttpServletRequest request,

                                  HttpServletResponse response ){

   try{

          request.setCharacterEncoding("shift_jis");

   }

   catch(Exception ex){

          ex.printStackTrace();}

   return true;

  }

}

            然后再struts-config.xml中定义,

            processorClass="common.Trans" />我放在了action后面。

            更改的重点为编码方式必须为shift_jis”,“UTF-8”则不可以。

  如果不是struts,web.xml中添加过滤器也可以,但可能因为版本问题,我这里的eclipse生成的web.xmldtd版本为2.2,不认识,有红X.但经过测试,却可以强行编译,运行,达到过滤的效果。

1.3.3  url中拼写参数时出现的乱码

     首先,在网上查了查,结果都是让我转字节码之类的方法,于是我设置了

new String(request.getParameter("a ").getBytes("ISO8859_1"),"shift_jis");

     但经过百般修改,试验均无效。翌日,突然想起以前做asp时。使用了escape方法来进行转码,和unescape进行解码,终于得出正确结果。

public class  EscapeUnescape

{

 public static String  escape (String src)

 {

  int i;

  char j;

  StringBuffer tmp = new StringBuffer();

  tmp.ensureCapacity(src.length()*6);

  for (i=0;i

  {

   j = src.charAt(i);

   if (Character.isDigit(j) || Character.isLowerCase(j) || Character.isUpperCase(j))

    tmp.append(j);

   else

    if (j<256)

    {

    tmp.append( "%" );

    if (j<16)

     tmp.append( "0" );

    tmp.append( Integer.toString(j,16) );

    }

    else

    {

    tmp.append( "%u" );

    tmp.append( Integer.toString(j,16) );

    }

  }

  return tmp.toString();

 }

 

 public static String  unescape (String src)

 {

  StringBuffer tmp = new StringBuffer();

  tmp.ensureCapacity(src.length());

  int  lastPos=0,pos=0;

  char ch;

  while (lastPos

  {

   pos = src.indexOf("%",lastPos);

   if (pos == lastPos)

    {

    if (src.charAt(pos+1)=='u')

     {

     ch = (char)Integer.parseInt(src.substring(pos+2,pos+6),16);

     tmp.append(ch);

     lastPos = pos+6;

     }

    else

     {

     ch = (char)Integer.parseInt(src.substring(pos+1,pos+3),16);

     tmp.append(ch);

     lastPos = pos+3;

     }

    }

   else

    {

    if (pos == -1)

     {

     tmp.append(src.substring(lastPos));

     lastPos=src.length();

     }

    else

     {

     tmp.append(src.substring(lastPos,pos));

     lastPos=pos;

     }

    }

  }

  return tmp.toString();

 }

}

转自:http://blog.csdn.net/emu/archive/2002/04/22/16337.aspx

 

 

2         标签

2.1        <html:errors property="username2"/>

Property属性对应ActionErrors.add(String,ActionMessage)中的String

2.2       

     paramId:           参数名

     paramName                对象名

     paramProperty    对象中的属性

单值
     
多参单值 paramId="p" paramName="dataForm" paramProperty 单值

多参单值

 

        单值

多参单值

 

     

3           其他

3.1              ActionMessage 从资源文件

parameter=""/>中获得对应的message

New ActionMessage("hello.talk.to.monster", name1name2,…));

将资源文件中对应的{0}换成name1中的内容,以此类推。

3.2              request

request.setAttribute("a","111")

requesta的请求赋值。

另:response.sendRedirect("a.jsp");无法传递request

request.getRequestDispatcher("a.jsp").forward(request,response);才能共享request中数据。
     

3.3              ActionMapping

       ActionMapping. getAttribute

       得到被定义的formBean的名称,返回String类型

3.4              方法

3.4.1           isCancelled

if(isCancelled(request))判断取消时间是否发生.

 

 

4           实例

4.1        1from对应多个action

可以在javaScript中作,但要注意指定action时要使用绝对路径

document.Form[0].action ="<%=request.getContextPath()%>/ApplyBtn.do";

这是因为struts已经为你搭好了框架,帮你写上了,而from本身是不清楚地,所以在javaScript中只好自己写。

4.2        标签中使用变量

     readonly属性为例,注意这里变量必须用布尔值

<%boolean bolReadOnly = applyForm.isReadOnly();%>

<html:text readonly="<%= bolReadOnly%>"/>

   

  

    

 

你可能感兴趣的:(struts,action,html,jsp,string,bean)