struts2笔记(入门)(2)

2019-08-30 21:49

链接地址 /test1/test1.action\>test1
struts.xml中的内容: /forward/test2.jsp /forward/test1.jsp 链接地址 /test2/test2.action\>test2
说明:在上面的配置文件中所用到的Test1Action和Test2Action这两个Action都只是继承了

com.opensymphony.xwork2.ActionSupport类,而ActionSupport默认返回的就是“success”,所以当点击上面的链接分别转到了forward目录下的test1.jsp和test2.jsp。下面重点来看这个package元素的namespace属性及action的name属性,它们共同定义了action所映射到的实质文件。上图展示了链接地址和action的对应关系,所以当我们要想访问一个action所关联到的jsp文件时,应该用namespace+action的name 关于它的内容测试可以参考struts2package项目。

补充:通常情况下,action元素的name是属性值是不能出现“/”的,所以希望通过action中name属性来实现多级映射,需要在sturts.xml中增加如下属性:

这样配置后就可以再action的name元素中使用“/”了。比如:

/forward/test3.jsp

然后输入/test3/test3.action\>test3
链接地址就可以访问了 强调:namespace默认值“”,即不配置namespace属性。它的意思是:如果action不能进行完整路径匹配,则会来此namespace下进行匹配,比如:.../test/test/test.action,如果参照namespace及action的name不能找到也之完全对应的action,它会再到依次追溯到上级目录中查找,即是说它会以?/test/test.action这样的路径来对应namespace和action的name进行查找。如果返回到最终的目录仍找不到,它就会到namespace=\对应的包下查找名为test的action,如果仍找不到,它就会去默认的namespace下查找名为test的action,如果找到则执行此action。另外,namespace也可以配置成namespace=\。它代表配置为项目的根。 总结action的名称探索顺序:完全对应、逐步追溯到上级目录查找、\下查找、默认namespace下查找。

为什么要提出namespace,主要是避免多人共同开发项目出现名字冲突。如果不使用namespace,多个

6

人所写的action中可能出现重名的现象,这样当项目合并时就会出现冲突。而有了namespace可以在项目开发时由项目经理给每一个人分不同的namespace,这样每个开发人员只需要保证自己所写的action不同名即可。

namespace引发的链接问题:当我们为action配置了namespace时,访问此action的形式总会是如下形式:.../webappname/xxx/yyy/ActionName.action 而当此action成功执行跳转到某个jsp页面时,如想在此jsp页面写链接,一定要写绝对路径,因为相对路径是相对.../webappname/xxx/yyy/,而如果以后我们修改了action的namespace时,相对路径又要变,所以链接不能写成相对路径。 以下介绍绝对路径的写法:通常用myeclipse开发时建立一个jsp文件,默认总会有如下内容:

<%

String path = request.getContextPath(); String basePath =

request.getScheme()+\+request.getServerName()+\+request.getServerPort()+path+\; %>

我们写绝对路径可以参此内容。还可以参下的\> 来完成绝对路径的书写。

4.分工合作include:指定多个配置文件

比如让jack来单独开发一个action,在jack.xml中的配置文件为:

/forward/test4.jsp

然后在struts.xml文件中增加如下内容: 它实质就是把jack.xml中的及其内容写进struts.xml中的根元素下。

链接:/jack/test4.action\>test4 这样便可以访问到了forward目录下的test4.jsp了。 5.tomcat认证访问 接上例:namespce的作用除了在前面提到的避免协同开发名字冲突外,还为认证提供一个条件。比如jack开发的东西所关联到的页面需要权限才能被访问。由于多为tomcat中的内容,下面只列出步骤。 步骤一,tomcat的conf目录下tomcat-users.xml内容如下:

步骤二,在web.xml中增加如下内容:

jack /jack/* POST GET

7

admin

admin

BASIC

input authentication message

这样配置完成后,当我们访问.../jack中的任何内容都会要求输入密码认证信息,认证时输入tomcat-users.xml配置的admin权限的用户名和密码即可访问(这里就只有jack用户名可以访问) 6.初识拦截器

拦截器能在action被调用之前和被调用之后执行一些“代码”。Struts2框架的大部分核心功能都是通过拦截器来实现的,如防止重复提交、类型转换、对象封装、校验、文件上传、页面预装载等等,都是在拦截器的帮助下实现的。每一个拦截器都是独立装载的(pluggable),我们可以根据实际的需要为每一个action配置它所需要的拦截器。

在myStruts2项目下,重新对配置文件作如下修改:

/success.jsp /failure.jsp

class=\/>

class=\/>

首先在package中定义了两个拦截器,然后在login action中引用了这两个拦截器,需要说明的是这里使用的拦截器都是系统自带的拦截器。其实在extends所继承的struts-default中就包含了很多拦截器,也包括我们这里所用的拦截器,但如果在此action中不使用params拦截器,将会报空指针错,因为params拦截器的作用是传递表单参数,如果不使用此拦截器就不能在action中得到表单参数,所以引用时会报空指针错。虽然extends继承的strust-default自带有params拦截器,但是当我们自己引用了拦截器时,继承struts-default将不会再为我们分配默认的拦截器(有点类似构造器),但是我们仍然可以通过来继续使用struts-defalut的拦截器。补充:由于上面的package继承于struts-default,而我们这里所用到的timer和params都是在struts-defalut中定义过,所以即使我们在中没有定义过这两个拦截器,也可以直接在action中引用。

8

使用组合多个拦截器:比如我们想把上面的params和timer这两个拦截器组合:

然后再在action引用”,效果和分别引用两个是一样的。其实我们使用strtus-default中的也是使用interceptor-stack方式。 7.Action中的method属性

在struts1.x中我们知道通过继承DispatchAction可以实现把多个Action进行统一操作,在struts2中实现action的统一操作也很简单。我们以crud操作为例,把crud集中到一个Action中。 步骤一、建立CRUDAction,内容如下:

package com.asm;

import com.opensymphony.xwork2.ActionSupport; public class CRUDAction extends ActionSupport { }

public String add() { }

public String del() { }

public String update() { }

public String query() { }

return \; return \; return \; return \;

步骤二、配置此Action,为了清晰明了,专为此Action,建立一个配置文件crud.xml,主要内容如下:

/crud/addSuccess.jsp

/crud/delSuccess.jsp

/crud/updateSuccess.jsp

/crud/querySuccess.jsp

分析:上面的method方法的值来源于CRUDAction中方法的名字,这样当我们访问上面的每一个Action时,它实质是和method指定的方法关联上。

9

步骤三、把crud.xml配置文件并入struts.xml中,只需增加如下代码:

步骤四、编写相应的jsp页面,在此略去crud文件夹下的四个跳转jsp页面(addSuccess.jsp等),重点是crud.jsp页面。内容如下:

<% %>

/crud/add.action\>添加数据
/crud/del.action\>删除数据
/crud/query.action\>查询数据
String path=request.getContextPath();

/crud/update.action\>修改数据

步骤五、发布测试。

补充扩展,动态调用DMI:不使用method实现统一.我们在crud.xml中增加如下内容:

/crud/op.jsp

然后再在crud.jsp中定义如下链接:

/crud/op!add.action\>添加数据
/crud/op!del.action\>删除数据
/crud/op!query.action\>查询数据
/crud/op!update.action\>修改数据

注意查看上面的链接地址,它们都是针对op action,然后再加地上“!+CRUDAction中相应的方法名”,最后再写上.action即可以访问到统一页面op.jsp。这样做虽然能减少页面,但是由于它们实质用到的是同一个Action,所以这就意味着我们要使用的拦截器相同,相同的跳转result。实际中这种方式很少使用,在此略作了解。如果不想使用动态方法调用,我们可以通过常量来关闭,即在struts.xml中增加如下配置:

扩展2:在CRUDAction中使用do。举例:我们在CRUDAction中增加一个新的方法,内容如下:

public String doMain(){ }

return \;

然后再在在crud.xml中增加如下内容:

/crud/main.jsp

注意:配置中method属性值是doMain中去掉do后M小写。然后再在crud.jsp中增加如下链接: /crud/main.action\>main页面

随后便可以访问到.../crud/main.jsp页面了。 8.使用ForwardAction实现页面屏蔽。

我们在jsp页面之间写链接总会是.../xxx.jsp,而如果我们想屏蔽掉具体的jsp,只需要所jsp页面配置成一个ForwardAction即可实现。示例如下:在根目录下有一个index.jsp主页,我们strtus.xml中作如下配置:

10


struts2笔记(入门)(2).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:11种蒙氏数学教具的使用方法 - 图文

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: