Struts1.3框架原理剖析(二)

知识点:

  1. 理解ActionForm以及ActionForm的设计膨胀问题
  2. 了解Action以及Action的设计膨胀问题
  3. 国际化

一、ActionForm

  1. 作用

a.可以自动接收URL参数

b.会把URL参数自动保存在request或session中(默认保存在session中)

c.会自动调用session.setAttribute()方法,在jsp页面中可以使用jstl直接把需要的URL参数取出来,而且也可以在Struts_config.xml配置文件中设置scope,来控制其存放的位置。

知识扩展:如果在jsp页面中要把URL参数直接输出来,那么我们要在Struts_config.xml中的action标签对中设置name属性,比如说我们设置的name属性值为loginForm,那么jstl取值就是${loginForm.map.username},这样就可以把页面中传过来的URL参数username的值显示出来。

2.创建步骤

  a.新建一个类继承至ActionForm(属于apache包下的)

  b.把要接收的URL参数以私有的方式写在里面(相当于VO)

  c.配置struts_config.xml配置文件,在struts_config标签对中添加form-beans标签对然后在该标签对中添加form-bean标签对,在该标签对中设置type属性,标明在哪个ActionForm中,然后设置name属性,要注意的时候在该标签对中的name属性要和响应的action标签对中设置的name属性的名字要一样,这样才可以正确的在jsp页面进行调用。

但是如果单纯的这样接收也就产生了ActionForm的设计膨胀问题,那么我们该怎么样来解决设计膨胀问题呢?

要使用DynaActionForm解决ActionForm设计膨胀问题,只需要在配置文件中把form-bean标签对中的type的属性值修改(在包底下找到该类查看),修改成org.apache.struts.action.DynaActionForm 这样我们就不用再去写ActionForm这个类了,而且在ActionServlet里面也可以正常调用,只需要转型的时候强制转换成DynaActionForm就可以了

需要注意的是当我们在jsp页面中取变量值的时候在表达式中要写上loginForm.map.username这样才可以正确的把值取出来,因为DynaActionForm源代码中使用了一个map在存取值

但是我们会发现,如果说一个操作有多个action标签对的话那么我们的配置文件中就会显得非常的繁杂,所以说我们可以使用DispatherAction来解决这个问题

解决步骤:

a.写一个类UserAction继承至DispatchAction(注意是属于apache的)

b.重写execute方法,允许写多个execute方法,然后把execute修改成具体的业务逻辑的名字

c.在action标签对中添加parameter属性,需要注意的是parameter属性的值应该跟jsp页面后面的参数一样,比如说有这样一个请求user.do?command=login那么parameter的值就是command然后把相应的execute名字修改成login,这样在提交该请求的时候就可以调用该方法里面的处理逻辑

二、ActionForward

我们知道ActionForward是用来页面跳转的,我们可以在配置文件中配置这样的话就可以在执行完成的时候自动跳转到配置文件所配置的jsp页面。但是我们想想如果说我们在某个特定的时候我们需要跳转到别的jsp页面该怎么办呢?很简单那就是在ActionForward这里下手。当然我们这里需要注意一下两种情况:

第一种是:

ActionForward ac = mapping.findForward(null);

      ac.setPath("/abc.jsp");

      return ac;

第二种是:

      ActionForward ac = new ActionForward();

      ac.setPath("/abc.jsp");

      return ac;

我们比较这两种会发现第一种不可以正确跳转,然后第二种可以正确跳转,第一种会报空指针,这是为什么呢?因为配置文件中已经设置好了,然后这样mapping取出来的是配置文件的东西,很显然一个程序在运行中是不可能实现对配置进行修改的,所以说运行后会报空指针错误,但是第二种的话是因为他是直接创建了一个ActionForward的对象,然后在设置path路径,最后返回这个新设置的路径进行跳转,所以说第二种是可以实现跳转的。

三、国际化

  1. 概念

      就是比如说我们要使得我们写的网站有多个语言版本的支持,我们就需要使用国际化,比如说我们在一个网页中输入www.yongyou.com,默认是显示的中文,但是如果说我们在浏览器的设置中把语言版本修改成英文的话那么网页显示的就是英文了而不是中文。

  2. 国际化的步骤

  1) 提供国际化资源文件

    文件命名规则:baseName_语言代码_国家代码.properties

  2)在struts_config.xml文件中配置,告诉其Basename的名字,例如:<message-resources parameter="MessageResource"/>

  3)在所需要用到的jsp页面中使用Bean标签把国际化资源文件中的配置根据浏览器语言的不同读取相应的key值。当然我们要注意的是要在jsp页面中把bean的uri地址链接进来,找到struts_taglib_1.3.10.jar下的META-INF下的tld下的相应的标签即可。然后在页面中使用标签<bean:message key=”login.username”/>来获取国际化资源配置文件中的key值 

  3.占位符的填充

概念占位符就是在网页中用来动态显示某个用户输入的值的,比如说我们要在用户登录的时候获取该用户名并显示,那么就要在国际化资源文件中加上占位符

格式:{ n }  n=0、1、2、3、4…表示占位符的顺序比如说:用户名{0}登陆成功

占位符填充方法:在jsp页面中占位符的填充方法有两种

1) 直接在jsp页面中使用bean标签对显示输出。例如:

<bean:message key="login.success" arg0="loginForm.map.username"/>,其中key是国际化配置文件中的key,loginForm是配置文件中name属性的值。

2)使用动态的国际化消息文本(创建步骤)

a)创建一个ActionMessages的对象,该对象就相当于一个容器

b) 创建一个ActionMessage的对象,代表一条国际化消息文本,在构造方法里面直接把值传递过去就可以了ActionMessages msg = new ActionMessage(“login.sucess”,username);其中username是获取到的值,前面的是国际化资源配置文件里面的要显示值的key

c)把上面的ActionMessage的对象添加到ActionMessages的对象(容器)当中,直接是msgs.add(“name”,msgs);name是jsp页面到时候取值的时候使用的值

d)直接传递国际化消息文本  只需要使用Action当中的方法就可以,例如: this.addMessages(request,msgs);

e)在JSP页面中,直接使用Request来取值,例如:在jsp页面中代码:从request中获取ActionMessages,<html:messages id=”a” message=”true” properties=”value”>${a}</ html:messages >这样就可以把相应的值取出来了  

你可能感兴趣的:(Struts1.3)