SSH框架入门(一)——Struts2基础及查错步骤

示例功能1:访问某一路径下的Action由Action跳转到jsp页面

访问login.do进入login.jsp页面

注意,以下所有的访问路径即配置信息均区分大小写

1.保证Struts2拦截器已经配入了WebService:

检查项目Web.xml中是否含有如下代码,及代码的拦截标准是否正确

<filter>
    <filter-name>struts2</filter-name>
    <filter-class>
	org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
    </filter-class>
  </filter>
<pre name="code" class="html">  <filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

 

其中:

<filter-class>
	org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
</filter-class>
这一段表示struts2的包引入的路径,在Myecilpse中按Ctrl+左键点击能进行跳转并出现类似以下页面表示书写正确:

另外下面这一段代码

  <filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
表示被Struts2所拦截的请求, 其中的 <filter-name>中内容应与上面一段代码的<filter-name>保持一致,/*表示拦截所有格式的请求,此处也可能会出现/*.action或/*.do表示仅拦截以.action或.do结尾的请求.

比如我有一个这样的访问:若我的拦截格式配置为/*.action再进行访问就会出现如下错误页面,控制台不报错:


该错误意为WebService没有找到/BBS/login.do这一路径下的页面.原因是我们的请求不满足/*.action这样的以action结尾的格式,所以并没有进入Struts2内部进行处理,并且我们也没有一个网页文件在这一路径下,所以WebService即会报出404.

2.保证为访问的Action配置了正确的访问路径.

我们进入Struts.xml文件,文件内部分为一个或多个package包,如

<package name="default" namespace="/" extends="json-default">

首先我们检查我们的package是否用extends关键字继承或者间接继承了json-default,即继承了其他的包其所继承的包最终也继承了json-default

同时记录一下包的namespace名称空间,若不为/则代表我们访问这一包内部所配置的Action时都需在访问路径前增加namespace后面的字符串.

还以这一路径举例:

我的这一路径对应的Action原本放在名称空间为/的包下,若我将其改放在名称空间为/abc的包下再次访问这一路径则会显示如下页面:


同时控制台也会输出:

2016-07-10 20:04:15,951 [org.apache.struts2.dispatcher.Dispatcher]-[WARN] Could not find action or result
There is no Action mapped for namespace / and action name login. - [unknown location]
以及错误堆栈

意思是:无法在名称空间/下找到对应的名为login的Action

此时我们可以用这一路径访问到刚刚正确的页面,即在项目名和访问路径中间加入了所在包配置的namespace名称空间/abc/

另外我们需要找到我们路径对应的action,比如我这里是这样配置的:


请求会进入与对应name相同的Action中,即要想访问配置的某一个Action,那么需要访问的路径为:[IP地址]:[端口号]/[项目名]/[所在包的名称空间]/[Action的name属性].action

如果访问的name出错时,同样会报出上面的无法在名称空间下找到对应的名字的Action的错误.

另外使用Struts2默认配置时访问Action的路径尾部需要加上.action或者.do的后缀.

若不加后缀访问的话会报出本篇的第一个错误,即404页面.

3.保证正确配置了action对应的JAVA类.

我们看到,struts.xml中action标签下有一个class属性,这一属性配置的就是action对应的java类的包路径.我上面之所以直接写了名称是因为我在集成了Spring之后只需要在此处写上对应的Spring对应的bean容器名.如果暂时没有集成Spring的话,此处应该这样写:

可以按住Ctrl左键单击路径进到对应的类说明配置对了.

如果集成了Spring的话其实也是一样的道理,我们一样需要在Spring的配置文件中配置其对应的类,配置了之后我们就可以在Action的class属性处直接使用Spring配置文件中配置的这个对应的Java类的id属性,比如我的Spring中的配置如下:


这里如果配错了,比如我吧我的action的class属性误写成了bbsusersAction1,就会出现如下界面:


上面那句话的意思是,Struts2无法实例化这个bbsusersAction1路径下的Action,因为这一路径下并没有对应的java类.

而如果是Spring配置文件中的路径写错了的话,应该会在tomcat等Web服务启动时就会由Spring的启动检查在控制台报出错误.也有可能没有打开Spring启动检查,但这里不再详述

4.保证正确编写了对应的java类

现在进入我们的action对应的java类,这个类应该继承struts的ActionSupport类:


另外应该有我们在struts.xml中配置的methord属性命名的方法,该方法返回值为String且应用public修饰

如我的Action这样配置:


那么,我的java类中就应该有一个getLogin方法:


并且我这个方法的返回值应该与配置文件中action标签内部的result标签的name一致,这里有多个result,当我们的java类对应的方法返回的字符串与某一条result的name相同时,浏览器页面便会跳转到该result内部写的路径下的jsp页面.

如果java类中没有名与配置文件中method属性一样的方法时,就会发生500错误.同时定位到你method处定义的方法名.并抛出NoSuchMethodException异常

比如我将method处定义为a而又不在java类中添加a()方法,那么我在访问时就会出现如下界面


该错误意思是找不到该cn.com.sundy.action.TitleListAction类下的该a()方法.

另外我们注意到,我有一个result是这样写的,


使用type=chain可以将请求重新转发到另一个action,即名字叫index的action然后由另一个action处理.若不加这一属性则不能将请求转发,只能返回浏览器一个jsp/html等页面文件.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值