关于这个的学习,中途出了一些以前米有见过或者是忘了怎么处理的debug。先记下来,免得以后忘了。
端口冲突:修改apache目录下的/conf/server.xml文件里关于8080端口(最好用默认的80端口)这样才不容易发生冲突。
查询出来的ResultSet rs,即使是只返回一个,也应该通过while(rs.next())而不是if(rs!=null)来进行相应处理。
其实就是记录不同书上~~~不同网上的人的笔记了啦啦啦啦~~~~
Struts2工作流程:
1.浏览器发送请求,如/request.action
2.StrutsPrepareAndExecuteFilter根据请求调用合适的Action
3.WebWork的拦截器链自动对请求应用通用功能,如验证、工作流或文件上传等
4.回调Action的execute方法,该execute首先获得用户请求参数,然后执行某种业务操作,既可以是将数据保存到数据库,也可以从数据库检索信息。Action是控制器,它会调用业务逻辑组件来处理用户的请求。
5.Action 的execute方法处理结果信息将输出到浏览器中,可以使html、图像、文档等
struts.xml
<struts> <!-- struts2使用包来组织Action。 --> <package name="struts2" extends="struts-default"> <!-- struts2的action名字就是它所处理的URL的前半部分。name属性既是该Action的名字页式它需要处理的URL的一部分,class指定实现类 --> <action name="login" class="com.ascent.struts2.action.LoginAction"> <result name="error">/error.jsp</result><!-- 配置逻辑视图和物理视图之间的一次映射 --> <result name="sucess">/welcome.jsp</result> </action> <action name="usrLoginAction" class="com.ascent.action.UsrLoginAction"> <result name="anli_success_1">/anli/registUsrWelcome.jsp</result> <result name="anli_success_2">/anli/registUsrWelcome.jsp</result> <result name="anli_success_3">/anli/adminWelcome.jsp</result> <result name="anli_error">/anli/login.jsp</result> </action> </package> </struts>
在extends后面我们还可以加上namesapce属性
如果namespace="/zhang",则访问时需要/zhang/test.action。zhang这个包包含了名为test的action。会先从/zhang的命名空间下找test的action,如果没有,再找默认""命名空间下的,如果再没有则系统出现错误。
定义Action时至少需要定义name属性,该name属性既是该Action的名字,也是它处理的URL的一部分。
class属性指定了它的实现类
可以加上method属性,那么就不会使用默认的execute方法来处理用户请求
<action name="login" class="com.login" method="login"> </action> <action name="regist" class="com.login"> </action>
另外,发现class相同的内容出现了两次,造成了代码冗余,所以可以使用通配符
当使用通配符定义Action的name属性时,相当于一个Action元素定义多个逻辑Action
<action name="*Action" class="com.login" method="{1}"> </action>
上面代码的含义:
相当于定义了一系列的Action,只要URL是*Action.action的模式,都可以通过Action进行处理,该Action定义了一个表达式{1},该表达式就是name属性值中的第一个*的值
如果用户请求的URL是loginAction.action,则调用该Action的login方法;如果是请求registAction.action,则调用regist方法。
也可以这样匹配class属性的值:
<action name="*Action" class=com.login.{1}Action>
redirect与dispatcher结果类型相对,dispatcher结果类型将请求forward(转发)到指定的jsp资源,而redirect意味将请求重定向到指定的视图资源。重定向的效果就是重新产生一个请求,因此所有的请求参数、请求属性和Action中封装的属性全部丢失。
redirect-action将请求重定向到一个Action
动态结果:
<action name="*"> <result>/{1}.jsp</result> </action>
如果请求test.action,则返回test.jsp。上面并没有为Action设置class属性,即改action使用ActionSupport来做为处理类。而且因为ActionSupport类的execute方法返回success字符串,即该Action总是返回result中指定的jsp资源,jsp资源使用了表达式来生成资源名。
拦截器设置(基于AOP面向方面编程):
作用:权限控制、跟踪日志、跟踪系统性能瓶颈
定义拦截器:
<interceptors> <interceptor name="log" class="com.LogInterceptor"/> <interceptor name="authority" class="com.AutoInterceptor"/> <interceptor-stack name="default"> <interceptor-ref name="authority"/> </interceptor> </interceptors>
在Action中使用拦截器或拦截器栈的方式是相同的:
<action name="login" class="com.LoginAction"> <interceptor-ref name="log"/> </action>
配置fileUpload拦截器
<action name="*ProductManagerAction" class="com.action.ProductManagerAction" method="{1}"> <!--配置fileUpload拦截器--> <interceptor-ref name="fileUpload"> <!--设置上传文件类型--> <param name="allowedTypes">image/bmp,image/png,image/jpg,image/gif,application/vnd.ms-excel</param> <!--设置上传文件大小--> <param name="maximumSize">2000000</param> </interceptor-ref> <!--必须显示配置引用struts默认的拦截器栈:defaultStack--> <interceptor-ref name="defaultStack"></interceptor> </action>
至于struts.properties配置文件里面的属性太多了,自己用到的时候再查查。。。。