您的位置:首页 > 编程语言 > Java开发

《深入浅出struts2》--第五章,表单标签案例1困惑解决

2015-07-23 11:06 876 查看
因为是刚刚学习Struts2框架,所以会遇见一些于大神而言简单的问题。特记录下来。

******************************************************************************************************

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标签中的属性赋值注意事项:









内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: