《深入浅出struts2》--第五章,表单标签案例1困惑解决
2015-07-23 11:06
876 查看
因为是刚刚学习Struts2框架,所以会遇见一些于大神而言简单的问题。特记录下来。
******************************************************************************************************
web.xml
动作类以及bean类
视图jsp文件
运行结果:
上面代码可以看出,就是通过网址去调用一个动作。而这个动作在执行中,需要实例化一个CheckBoxTest2Action.java。而在这个CheckBoxTest2Action类中有个实例方法getMagazineList(),在其类实例化的对象会拥有这个方法。然后通过这个方法获得四个Magazine对象的list集合。然后struts把控制权转移到Checkbox2.jsp页面,通过一个迭代标签和Checkbox标签把list集合显示。
我的困惑:
1,视图jsp文件中的<s:iterator value="magazineList">这句中magazineList哪里来的?
由于这本书没有深入讲struts2框架原理,有点偏入门和应用。下面是个人思考,可能不对,后面深入理解框架原理的时候会回来更改错误理解。
struts2框架要求action类的属性命名规范必须符合javabean,并且每个属性一定要有相对应的getter和setter方法。并且struts2框架还要求一定要有一个空参的构造函数。但是观察本案例中CheckBoxTest2Action动作类并没有magazineList这个属性。但是却有magazineList相对应的getter和setter方法。思考了一下以前学习javabean知道了判断一个bean类里面有多少个字段属性,不是看声明的变量有多少,而是看有多个getter(或setter)方法。bean类中,即使没有声明那个变量,但是有相应的setter或getter方法,那么的话依旧会有那个变量的属性(猜测,这个变量很可能是在bean类实例化过程中,JVM动态加上对应的这个变量)。而struts中action类要求必须有setter和getter方法,并且命名规范必须符合javabean。可以知道在运行过程,这个magazineList属性会被自动加上。
提示,想深入理解,我觉得去好好学习下JVM运行原理以及struts技术的内幕
2,<s:iterator value="magazineList">怎么访问到magazineList?
下面是个人思考,后面深入理解技术内幕会再更改错误理解。
当在网址中输入一个网址,struts会用web.xml配置文件对应置的过滤器根据struts.xml解析这个网址是对应哪个动作,<action
name="CheckBox2" class="app05a.CheckBoxTest2Action" >找到了这句,发现有class属性,struts则先会实例化这个动作类。然后把这个动作类的对象压入Value Stack栈中的Object Stack区域内,并且这个对象中有个magazineList成员变量,这个成员变量是一个指向四个Magazine类对象的List集合的引用,这四个对象也存储在Object Stack区域内。然后执行action类默认的execute()动作方法,简单返回一个默认的SUCCESS字符串,struts根据这个字符串把控制权转移到本案例的视图页面。
提示一下,struts在实例化一个动作类时,会调用每个属性对应的setter方法为每个属性赋值。上面四个Magazine实例才有。并且在视图页面,struts标签在访问每个字段属性时,我猜测底层实现肯定利用反射等等知识,并且是执行了getter方法获得值。
[b]2,<s:iterator value="magazineList">为何直接写上magazineList就可以啦?
[/b]
[b]直接见本书中:[/b]
[b]
[/b]
[b]
[/b]
用struts标签读取Object Stack中的对象,上面规则写即可。所以本案例中实质是省略了动作类对象的引用[0].实为value="[0].magazineList"。经过加上测试依的确如此。
struts标签中的属性赋值注意事项:
******************************************************************************************************
web.xml
<span style="background-color: rgb(255, 255, 255);"><span style="color:#3333ff;"><?xml version="1.0" encoding="UTF-8"?> <web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> <display-name></display-name> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <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> </web-app></span></span>struts.xml
<span style="color:#3333ff;"><?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <package name="learn" extends="struts-default" namespace="/"> <action name="CheckBox2" class="app05a.CheckBoxTest2Action" > <result> <param name="location">/jsp/CheckBox2.jsp</param> </result> </action> </package> </struts></span>
动作类以及bean类
<span style="color:#3333ff;">package app05a; import java.util.ArrayList; import java.util.List; import com.opensymphony.xwork2.ActionSupport; public class CheckBoxTest2Action extends ActionSupport { public List<Magazine> getMagazineList(){ List<Magazine> magazines=new ArrayList<Magazine>(); magazines.add(new Magazine("034","name1")); magazines.add(new Magazine("124","name2")); magazines.add(new Magazine("334","name3")); magazines.add(new Magazine("634","name4")); return magazines; } public void setMagazines(String[] codes){ for (String code : codes) { System.out.println(code+" is selected"); } } }</span>
<span style="color:#3333ff;"></span><pre name="code" class="java">package app05a; public class Magazine { private String code; private String name; public String getCode() { return code; } public String getName() { return name; } public Magazine(String code, String name) { super(); this.code = code; this.name = name; } }
视图jsp文件
<span style="color:#3333ff;"><%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@taglib prefix="s" uri="/struts-tags" %> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> </head> <body> <s:form> <s:iterator value="</span><span style="color:#cc0000;">magazineList</span><span style="color:#3333ff;">"> <s:checkbox name="magazines" label="%{name}" fieldValue="%{code}"/> </s:iterator> </s:form> </body> </html></span>
运行结果:
上面代码可以看出,就是通过网址去调用一个动作。而这个动作在执行中,需要实例化一个CheckBoxTest2Action.java。而在这个CheckBoxTest2Action类中有个实例方法getMagazineList(),在其类实例化的对象会拥有这个方法。然后通过这个方法获得四个Magazine对象的list集合。然后struts把控制权转移到Checkbox2.jsp页面,通过一个迭代标签和Checkbox标签把list集合显示。
我的困惑:
1,视图jsp文件中的<s:iterator value="magazineList">这句中magazineList哪里来的?
由于这本书没有深入讲struts2框架原理,有点偏入门和应用。下面是个人思考,可能不对,后面深入理解框架原理的时候会回来更改错误理解。
struts2框架要求action类的属性命名规范必须符合javabean,并且每个属性一定要有相对应的getter和setter方法。并且struts2框架还要求一定要有一个空参的构造函数。但是观察本案例中CheckBoxTest2Action动作类并没有magazineList这个属性。但是却有magazineList相对应的getter和setter方法。思考了一下以前学习javabean知道了判断一个bean类里面有多少个字段属性,不是看声明的变量有多少,而是看有多个getter(或setter)方法。bean类中,即使没有声明那个变量,但是有相应的setter或getter方法,那么的话依旧会有那个变量的属性(猜测,这个变量很可能是在bean类实例化过程中,JVM动态加上对应的这个变量)。而struts中action类要求必须有setter和getter方法,并且命名规范必须符合javabean。可以知道在运行过程,这个magazineList属性会被自动加上。
提示,想深入理解,我觉得去好好学习下JVM运行原理以及struts技术的内幕
2,<s:iterator value="magazineList">怎么访问到magazineList?
下面是个人思考,后面深入理解技术内幕会再更改错误理解。
当在网址中输入一个网址,struts会用web.xml配置文件对应置的过滤器根据struts.xml解析这个网址是对应哪个动作,<action
name="CheckBox2" class="app05a.CheckBoxTest2Action" >找到了这句,发现有class属性,struts则先会实例化这个动作类。然后把这个动作类的对象压入Value Stack栈中的Object Stack区域内,并且这个对象中有个magazineList成员变量,这个成员变量是一个指向四个Magazine类对象的List集合的引用,这四个对象也存储在Object Stack区域内。然后执行action类默认的execute()动作方法,简单返回一个默认的SUCCESS字符串,struts根据这个字符串把控制权转移到本案例的视图页面。
提示一下,struts在实例化一个动作类时,会调用每个属性对应的setter方法为每个属性赋值。上面四个Magazine实例才有。并且在视图页面,struts标签在访问每个字段属性时,我猜测底层实现肯定利用反射等等知识,并且是执行了getter方法获得值。
[b]2,<s:iterator value="magazineList">为何直接写上magazineList就可以啦?
[/b]
[b]直接见本书中:[/b]
[b]
[/b]
[b]
[/b]
用struts标签读取Object Stack中的对象,上面规则写即可。所以本案例中实质是省略了动作类对象的引用[0].实为value="[0].magazineList"。经过加上测试依的确如此。
struts标签中的属性赋值注意事项:
相关文章推荐
- javac、jar使用实录
- JDK安装后 没有tools.jar 和dt.jar包的解决办法
- Spring(四)JavaBean作用范围的配置及生命周期
- struts2.Action中的method属性配置
- struts2.Action中的method属性配置
- 设置jdk环境变量时lib中的rt.jar ,dt.jar ,tool.jar是什么,作用是什么
- java反射--METHOD
- db连接池
- Java 希尔排序
- JAVA字符串转日期或日期转字符串
- 配置JAVA的环境变量
- Spring的事务传播属性,数据库的隔离级别
- eclipse 启动不了,提示adt版本过低
- java中final关键字详解
- eclipse android开发中关于XML文件效果即Graphical Layout 显示不出效果
- 《JAVA与模式》之抽象工厂模式
- cxf+spring开发(三)--- 限制固定Ip地址对接口的访问次数
- java获取视频播放时长
- MyEclipse中spring_servlet.xml报异常错误:Referenced file contains error(...)For&n
- 开启struts2自带的开发模式常量