环境搭建 1.1 jar 1.2 web.xml 1.3 struts.xml struts.xml(核心配置文件) 目录结构: Struts.xml Struts.base.xml regex:. Struts.sy.xml /hello.jsp 1.2、Actionu 不需要指定父类(ActionSupport)u 业务方法的定义 public String xxx();//executeu Action是多例模式(注:在spring中的配置中一定要注意) Action用来接收参数 1.3、参数赋值u Action中定义属性,并提供get/set方法 userName, getUserName/setUserName u ModelDriven 返回实体,不能为null,不需要提供get/set方法 u ModelDriven返回实体和Action中属性重名,ModelDriven中优先级更高 注:ognl,ActionContext学完就知道了 案例:Action代码(user1不提供set、get方法):private String uname; private User user1 = new User(); private User user2; public String execute() { System.out.println(“uname:”+uname); System.out.println(“user1:”+user1); System.out.println(“user2:”+user2); return “hello”; } 浏览器输入:http://localhost:8080/Y2_struts_ognl/sy/helloAction?uname=zs结果: 之后 说明modeldriven接口拦截了uname赋值 浏览器输入:http://localhost:8080/Y2_struts_ognl/sy/helloAction?user2.uname=zs结果: 说明struts支持对象导航 1.4、 与J2EE容器交互u 非注入 耦合(ServletActionContext) 解耦(建立使用解耦模式(ActionContext) u 注入 耦合(XxxAware) 解耦 1.5 核心文件配置u include 包含文件 file u package 包 name 包名 extends 继承 namespace 虚拟路径 abstract 通常用来被继承 u action 子控制器 name:helloAction,helloAction_ class 全限定名 method:execute,{1} u result 结果码处理 Name 结果码配置 type:dispatcher|redirect 1.6、动态方法调用
/rs.jsp 注1:动态方法调用,新版本中已禁用,可自行开启或关闭注2:子控制器的访问路径:名称空间+"/"+子控制器名字_xxx+".action" 2、Ognl1、OGNL的全称是Object Graph Navigation Language(对象图导航语言),它是一种强大的表达式语言2、OgnlContext(ongl上下文)其实就是Map (教室、老师、学生)OgnlContext=根对象(1)+非根对象(N)非根对象要通过"#key"访问,根对象可以省略"#key" 注1:context:英文原意上下文,环境/容器 3、根对象和非根对象的理解4、ValueStack 先进后出的数据结构,弹夹 push/pop 使用ValueStack作为根对象,是因为放到值栈中的对象都可视为根对象5、struts2中传递数据可以使用作用域,但更多的是利用ValueStack或ActionContext作用域取值:从小到大(page -> request -> session -> application)ValueStack取值:从上到下 作用域取值:
result,result是一个key,是一个字符串。ValueStack取值:<s:propertyvalue="result"/>,result是一个表达式。6、保证同一请求中只创建一个上下文图解:actionContext上下文就好比一个大容器其中根对象容器:valuestack非跟对象容器:request、session、application、parametersValuestack中始终是从上往下去找属性值,找到后就不会向下去找了。Name:小明同学Salary:2000因为vs中最上面的是Student对象、其次是Employee对象。Student对象中没有salary属性,会在employee对象中去找。publicStringexecute()ActionContextcontext=ActionContext.getContext();//栈:表示一个先进后出的数据结构ValueStackvs=context.getValueStack();//push方法把项压入栈顶vs.push(newEmployee("zs",22));vs.push(newEmployee("ls",22));vs.push(newEmployee("ww",22));//pop方法移除栈顶对象并作为此函数的值返回该对象Employeee=(Employee)vs.pop();System.out.println(e.getName());e=(Employee)vs.pop();System.out.println(e.getName());e=(Employee)vs.pop();System.out.println(e.getName());vs.push(newEmployee("张雇员",2000));//1vs.push(newStudent("小明同学","s001"));//0System.out.println(vs.findValue("name"));System.out.println(vs.findValue("salary"));returnnull;一次请求只生成一个actioncontext对象<{result }
url/param标签
<s:set var=“blue” value=“result” /> <s:url var=“url1” namespace="/sy" action=“tagAction_formSubmit”> <s:param name=“color1” value=“blue”></s:param> <s:param name=“color2”>blue</s:param> </s:url> <s:property value="#url1" />
date标签
<% request.setAttribute(“d”, new Date()); %> <s:date name="#request.d" format=“yyyyMMdd” /> <s:debug />
push标签
<s:property /> <s:push value=“result”> <s:property /> </s:push>
u 控制标签 iterator/if/elseif/else <% request.setAttribute(“score”, new Integer(70)); request.setAttribute(“names”, new String[] { “zs”, “ls”, “ww” }); %>
控制标签
<s:if test="#request.score >= 90"> A </s:if> <s:elseif test="#request.score >= 80"> B </s:elseif> <s:elseif test="#request.score >= 70"> C </s:elseif> <s:elseif test="#request.score >= 60"> D </s:elseif> <s:else> E </s:else>
<s:iterator var=“v” value="#request.names">
- <s:property value="#v" />
</s:iterator>
3.2、UI标签u 表单标签 主题:xhtml/simple(自带样式,无法table排列样式) u 非表单标签3.3、标签的属性类型说明String 字符串 Boolean true|false Object Object/String 传过去字符串,但会被认为是一个OGNL表达式进行计算 %{str}:str会被强制转换成OGNL表达式计算 <s:a href="%{#url1}">bbb</s:a>3.4、标签的公共属性var 将值保存到上下文(ActionContext)中的一个keyscope 4+action action=request+actionContext4、struts实现crud1、定义baseAction,存放结果码常量,请求、响应、上下文、公用的传值2、Struts标签的使用 s:iterator S:action S:url S:form s:textfield S:select S:radio S:param s:textarea List.jsp
<s:action var=“clzAction” namespace="/sy" name=“clazzAction”/> <s:form namespace="/sy" action=“studentAction_list” > <s:textfield name=“sname” label=“姓名”></s:textfield> <%-- <s:select list="#{1:‘aa’,2:‘bb’,3:‘cc’}" headerKey="" headerValue="=
请选择="></s:select> --%> <s:select label=“班级” name=“cid” list="#clzAction.result" headerKey="" headerValue="=
请选择=" listKey=“cid” listValue=“cname”></s:select> <s:submit value=“查询”></s:submit> </s:form>
新增
新增2 <s:iterator var=“s” value=“result”> </s:iterator>
序号 |
学号 |
姓名 |
拼音 |
性别 |
标记 |
班级 |
操作 |
序号 |
<s:property value="#s.sid"/> |
<s:property value="#s.sname"/> |
<s:property value="#s.spin"/> |
<s:property value="#s.sex"/> |
<s:property value="#s.mark"/> |
<s:property value="#s.cname"/> |
<s:url var=“durl” namespace="/sy" action=“studentAction_del”> <s:param name=“sid” value="#s.sid"/> </s:url> <s:a href="%{#durl}">删除</s:a> <s:url var=“eurl” namespace="/sy" action=“studentAction_load”> <s:param name=“sid” value="#s.sid"/> </s:url> <s:a href="%{#eurl}">修改</s:a> |
<z:page pageBean="
pageBean"/>Add.jsp<h1>add</h1><s:actionvar="caction"namespace="/sy"name="clazzAction"></s:action><s:formnamespace="/sy"action="studentActionadd"><{pageContext.request.contextPath }/sy/userActionQuery.action" method=“post”> Xml配置
/querySuccess.jsp /error.jsp 定义拦截器的类 结果 5.2、struts之上传下载注意:private File file;
private String fileContentType;
private String fileFileName;开头的file与文件传递的name相对应enctype=“multipart/form-data” private String uploadDir = “/upload”;// web项目下的目录,虚拟路径,会跟随服务器的位置而改变 Jsp上传页面 Jsp下载页面<s:url var=“saveAsUrl” namespace="/sy" action=“userFileUpload_saveAs.action”></s:url><s:property value=“saveAsUrl”/><s:a href="%{#saveAsUrl}">直接打开</s:a> <s:url var=“openAsUrl” namespace="/sy" action=“userFileUpload_openAs.action”></s:url><s:property value=“openAsUrl”/>
Xml配置 /querySuccess.jsp Java类 结果