我来解释(逗逼)一下,方法3中struts框架的数据处理流程
1.和方法2不同点:把User换成List其它流程一样
2.关键在于理解逻辑视图分离的思想,框架先提取视图中的表单数据,用action的属性name在xml中找到匹配的Action类,并实例化这个类的一个对象,用set方法把表单数据注入这个对象,执行xml中method指定的方法,用返回值匹配result返回对应视图
3.以上流程可以看出,视图不需要考虑怎么把数据传给逻辑,逻辑也不考虑怎么得到数据怎么把结果视图返回给用户,一切由MVC框架完成,逻辑视图控制器相互独立,这就是解耦,可以参考spring中“依赖注入”的概念,本质是一样的
1.和方法2不同点:把User换成List其它流程一样
2.关键在于理解逻辑视图分离的思想,框架先提取视图中的表单数据,用action的属性name在xml中找到匹配的Action类,并实例化这个类的一个对象,用set方法把表单数据注入这个对象,执行xml中method指定的方法,用返回值匹配result返回对应视图
3.以上流程可以看出,视图不需要考虑怎么把数据传给逻辑,逻辑也不考虑怎么得到数据怎么把结果视图返回给用户,一切由MVC框架完成,逻辑视图控制器相互独立,这就是解耦,可以参考spring中“依赖注入”的概念,本质是一样的
2016-09-28
我来解释(逗逼)一下,方法2中struts框架的数据处理流程
1.和方法1不同点:表单数据被注入了User对象,再把user注入LoginAction
2.从Login.jsp视图中得到表单数据后,用action="name1.action"的name1匹配xml中的<action>的name
3.匹配成功的是LoginAction,框架会实例化它的一个对象,由于这个对象有一个User属性,再实例化一个User对象,然后用set方法把表单数据注入user再用set方法把user注入LoginAction
4.执行login方法得到返回值,用返回值找到<result>中对应的jsp视图返回给用户
1.和方法1不同点:表单数据被注入了User对象,再把user注入LoginAction
2.从Login.jsp视图中得到表单数据后,用action="name1.action"的name1匹配xml中的<action>的name
3.匹配成功的是LoginAction,框架会实例化它的一个对象,由于这个对象有一个User属性,再实例化一个User对象,然后用set方法把表单数据注入user再用set方法把user注入LoginAction
4.执行login方法得到返回值,用返回值找到<result>中对应的jsp视图返回给用户
2016-09-28
我来解释(逗逼)一下,方法1中struts框架的数据处理流程
1.用户在login.jsp提交表单数据后,提取<form>的属性action="name1.action"
2.用name1去匹配struts.xml中<action>的属性name,案例中是LoginAction
3.执行匹配成功的action对应的class对应的method,得到返回值
4.用返回值去匹配<result>的属性name返回对应jsp,name被省略了返回默认success.jsp
关键是步骤3中,Struts框架会先实例化class的一个对象,然后用set方法把表单数据注入到这个对象,所以必须先实现set方法
1.用户在login.jsp提交表单数据后,提取<form>的属性action="name1.action"
2.用name1去匹配struts.xml中<action>的属性name,案例中是LoginAction
3.执行匹配成功的action对应的class对应的method,得到返回值
4.用返回值去匹配<result>的属性name返回对应jsp,name被省略了返回默认success.jsp
关键是步骤3中,Struts框架会先实例化class的一个对象,然后用set方法把表单数据注入到这个对象,所以必须先实现set方法
2016-09-28
我来解释(逗逼)一下,案例代码的命名太具迷惑性了,不易理解struts执行流程
1.收到页面请求/HelloWorld/name1_name2_… .action后,用name1_name2_…匹配<action>的属性name="*_*_…",并用name1代替所有{1},name2代替所有{2}…以此类推
2.执行对应<action>的对应class的对应method,得到返回值value
3.用返回值匹配<result>的属性name,若精确匹配则返回对应视图jsp给用户;若匹配失败,如果返回值是SUCCESS则返回默认jsp,如果是NONE则返回空jsp,如果是ERROR则显示错误页面
1.收到页面请求/HelloWorld/name1_name2_… .action后,用name1_name2_…匹配<action>的属性name="*_*_…",并用name1代替所有{1},name2代替所有{2}…以此类推
2.执行对应<action>的对应class的对应method,得到返回值value
3.用返回值匹配<result>的属性name,若精确匹配则返回对应视图jsp给用户;若匹配失败,如果返回值是SUCCESS则返回默认jsp,如果是NONE则返回空jsp,如果是ERROR则显示错误页面
2016-09-28
我来解释(逗逼)一下,Struts版本已经更新至2.5.2,配置不一样了
1.感叹号方法
除了要常量<constant .../>,还要在<package>中增加属性:strict-method-invocation="false"
2.通配符方法
不需要常量<constant.../>,但要在<package>中增加属性:strict-method-invocation="false"
即:<package name="default" namespace="/" extends="struts-default" strict-method-invocation="false">
1.感叹号方法
除了要常量<constant .../>,还要在<package>中增加属性:strict-method-invocation="false"
2.通配符方法
不需要常量<constant.../>,但要在<package>中增加属性:strict-method-invocation="false"
即:<package name="default" namespace="/" extends="struts-default" strict-method-invocation="false">
2016-09-28
我来解释(逗逼)一下,不一定正确,可以参考:
现在struts版本更新了,目前是struts-2.5.2,以上代码直接运行会出错
1.@里昂 说的:把log4j-api-2.5.jar包加到lib和path里
2.@零度空间 说的:xwork-core.jar包已经没了
3.@零度空间 说的:<filter-class>改为org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter去掉ng
4.运行出错很可能某个猥琐小角落的代码敲错了,仔细检查!仔细检查!仔细检查!重要的事说三遍!
5.我查起bug来才发现自己的手有多残
现在struts版本更新了,目前是struts-2.5.2,以上代码直接运行会出错
1.@里昂 说的:把log4j-api-2.5.jar包加到lib和path里
2.@零度空间 说的:xwork-core.jar包已经没了
3.@零度空间 说的:<filter-class>改为org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter去掉ng
4.运行出错很可能某个猥琐小角落的代码敲错了,仔细检查!仔细检查!仔细检查!重要的事说三遍!
5.我查起bug来才发现自己的手有多残
2016-09-27
如果是struts2 2.5版本,log4j-api-2.5.jar包也要加进去,否则tomcat服务器会启动失败
2016-09-23
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>
<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>
2016-09-22
两个不同错误信息的写法:
用户名:<input type="text" name="username"><s:fielderror><s:param>username</s:param></s:fielderror><br>
密码:<input type="password" name="password"><s:fielderror><s:param>password</s:param></s:fielderror><br>
this.addFieldError("username", "用户不能为空");
this.addFieldError("password", "密码不能为空");
用户名:<input type="text" name="username"><s:fielderror><s:param>username</s:param></s:fielderror><br>
密码:<input type="password" name="password"><s:fielderror><s:param>password</s:param></s:fielderror><br>
this.addFieldError("username", "用户不能为空");
this.addFieldError("password", "密码不能为空");
2016-09-21