struts2 1-基础篇

Struts2的核心是通过拦截器(动态代理)实现的。

拦截器和过滤器实现的功能基本相同,但是实现原理不同。

拦截器   的实现原理:  动态代理

过滤器   的实现原理:  函数调用

 

1struts2的执行流程:  
    当用户在浏览器中敲入要访问的地址的时候,浏览器会将这个请求发送给tomcat然后tomcat判断应该交给哪个WebApplication来处理,然后会读取它的web.xml配置,发现有配置:  
     <filter>  
         <filter-name>struts2</filter-name>  
         <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>  
     </filter>  
  
     <filter-mapping>  
         <filter-name>struts2</filter-name>  
         <url-pattern>/*</url-pattern>  
     </filter-mapping>

因为<url-pattern> /*,所以它会过滤所有的请求然后都交给filter:org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter处理执行调用doFilter()方法,在doFilter()方法中会读取struts.xml文件,根据用户请求的地址找到相应的package、 action,在action中执行完一定的操作后,根据它的返回值执行相应的result,跳转到某一新的页面(默认是dispatcher跳转,在知识点13会详细讨论),然后将该页面返回给浏览器。 

2struts2的命名空间namespace

namespace决定了action的访问路径,默认为"",可以接收所有路径的action。namespace可以写为/,或者/xxx,或者/xxx/yyy,对应的action访问路径为/index.action,/xxx/index.action,或者/xxx/yyy/index.action(action可以不写)  
namespace最好也用模块来进行命名  

如果在url中写http://localhost:8080/Struts2_0400_Path/,而在struts.xml中没有对应的namespace-->"/",则会交给tomcat进行处理,tomcatweb.xml<welcome-file-list>,访问这里面定义的文件。

3struts1 struts2的一个重要区别:在struts1中进行多次访问的时候用到的是同一个Action对象。而struts2则是每一次访问都会创建一个Action对象,所以struts2不会有线程安全问题的发生

4<result>标签如果没有指定name属性,默认返回值为“success”

   <action>标签中的class值如果没有配置相应的类,它会调用struts默认的一个处理类ActionSupportexecute()方法,返回SUCCESSpublic static final String SUCCESS = "success";).

5实现struts的处理类的时候不要自己随便写类然后定义execute()方法,也不要实现Action而要从ActionSupport类继承,这样便可以直接使用它为我们定义好的方法.(可以根据需要来重写execute()方法)。

6、路径问题:

struts2中的路径问题是根据action的路径而不是jsp路径来确定,所以尽量不要使用相对路径。 

解决办法非常简单,统一使用绝对路径,譬如:

定义了:

当访问http://localhost:8080/Struts2_0400_Path/path/path时,会导入到path.jsp页面中,在path.jsp中,如果直接写:<a href="index.jsp">index.jsp</a>(相对路径),那么将访问的是http://localhost:8080/Struts2_0400_Path/path/index.jsp,如果写<a href="/index.jsp">index.jsp</a>,则会访问到http://localhost:8080/index.jsp(访问到apache的官网那个页面了)。

解决方案:

path.jsp中:

这样直接访问<a href="index.jsp">index.jsp</a> 就行了。

(request.getContextPath()得到项目的名字,一般用来解决路径问题 如果项目为根目录,则得到一个"",即空的字条串。  
  request.getscheme()返回的协议名称.默认是http   
  request.getServerName()就是获取你的网站的域名,如果是在本地的话就是localhost   
  request.getServerPort()获取服务的端口号

7动态方法调用:

action执行的时候并不一定要执行execute方法,可以在配置文件中配置action的时候用method=add来指定执行哪个方法(会产生太多的action,所以不推荐使用)。

 也可以在访问url地址中动态指定/**/**.action!add(动态方法调用DMI)(推荐)

8、通配符配置:

通配符可以将配置量降到最低,不过一定要遵守"约定优于配置"的原则

{1}代表name="Student_*"后面第一个'*',同理{2}代表第二个'*' 

如果action之间有重复配置,struts2会匹配最精确的action。而只要是包括*则是同一级,哪个在前匹配哪个。

9、接受action传过来的参数:

(1)、用Action的属性接收参数

在继承ActionSupport的类中定义要接受的参数,参数的名称与action所传的名称无关,在struts2内部调用的是属性的set方法,所以setxxx()的名字一定要与action后面所传的值是一样的。

(2)、用DomainModel接收参数
     如果要接受的参数的个数很多,我们可以不用定义属性而是直接定义一个对象,例如:  
      private User user set get 方法)在调用action传值的时候使用user!add?user.name=x&user.age=x的方式进行值得传递。(最常用的方式

(3)、用ModelDriven接收参数(不常用)

10Struts2_访问Web元素

访问http://localhost:8080/Struts2_1200_AccessWebElements/login/login

系统自动将requestsessionapplication注入到LoginAction中,然后默认调用execute()方法,往requestsessionapplication中添加值,根据返回的SUCCESS,进入到user_login_success.jsp页面,

点击【Debug】后显示的结果,它包含两部分:value stack以及stack context

在实际开发中很少去获取request,因为没必要,action中的成员变量(非requestsessionapplication会起到request的作用,即接受到来自页面的参数,然后放到成员变量中,而成员变量是存放在value stack的(value stack本身是放在stack context中的)。application也基本不用,当想放全局的内容时,1可以放数据库中,2可以自己定义一个Class。。所以基本就用控制反转IoCsession

如在action中:

那么在jsp页面中是这么来取

11、模块包含

struts2.xml

login.xml

12、访问默认action

13、结果类型:result type

result type的最常用的几种配置:(四种配置分别代表了四种不同的跳转方式)  

14、全局结果集 

首先访问:http://localhost:8080/Struts2_1600_GlobalResult/index.jsp

Index.jsp页面代码:

struts2.xml代码:

UserAction代码:

AdminAction代码:

 

假如有许多action,他们都有一个共同的result,如果在每个action中配置一行,那么会很繁琐,所以我们把这个公共的result写在globalresult中,指在这个package中,所有的action都可以共用的结果集。而如果另外一个package也想用这个结果集,那么让这个包extends上一个包,则上个包的配置这个包也就全部都有了。

譬如在一个项目中分了4个模块,每个模块有自己单独的配置,但是譬如出了错返回错误页面,或者访问不存在的action时回到主页,这些东西不需要在每个模块中都配,所以可以定义一个包,然后让其他的包都继承这个包。

15、动态结果集dynamic result:

index.jsp页面:

strust2.xml代码:

UserAction代码:

16、带参数的结果集

当从一个action dispatcher服务器端跳转)到另一个action时,这两action是共享同一个value stack,即一次request(服务器端的dispatcher对于客户端就是一次request)只有一个value stack,第二个action是可以直接读取前一个action的里面的值,不需要传递参数

但如果是客户端跳转(redirect)的方式进行跳转,实际上是发出了两次request,所以他们不共享value stack,原来value stack中的值后面访问不了了,所以需要传递参数,进行如下的配置:  

当在index.jsp中点击“传参数”时:

struts.xml代码:

UserAction代码:

转向的user_success页面的代码:

Result总结:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值