---恢复内容开始---
Struts相关知识点
Struts是什么? 是基于MVC模式的web应用框架,它本质上相当于一个servlet
Struts的配置
在eclipse中创建一个项目 然后在当前项目中WEB-INF文件夹下的lib文件中导入有关Struts的jar文件,接着在src里面创建一个struts.xml文件 在当前项目中找到Libraries→Web App Libraries点击→有一个struts2-core-2.3.24.jar文件里面有一个struts-default.xml文件点击有一下
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
这段复制到在src里面创建一个struts.xml文件中 接着写配置文件 如:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE struts PUBLIC 3 "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" 4 "http://struts.apache.org/dtds/struts-2.3.dtd"> 5 <struts> 6 <package name="mypackage" extends="struts-default"> 7 <!-- 通用符 ! login!add.action * --> 8 <action name="login*" class="com.action.LoginAction" method="{1}"> 9 <result name="success">/success.jsp</result> 10 </action> 11 </package> 12 </struts>
接着在web.xml文件里面写个过滤器,不写会在网页是报个404找不到路径的错 web.xml文件写 如图:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> 3 <display-name>struts01</display-name> 4 <welcome-file-list> 5 <welcome-file>index.html</welcome-file> 6 <welcome-file>index.htm</welcome-file> 7 <welcome-file>index.jsp</welcome-file> 8 <welcome-file>default.html</welcome-file> 9 <welcome-file>default.htm</welcome-file> 10 <welcome-file>default.jsp</welcome-file> 11 </welcome-file-list> 12 13 <!-过滤器-> 14 <filter> 15 <filter-name>struts2</filter-name>
16 <!-Ctrl+Shift+T 输入StrutsPrepareAndExecuteFilter->
17 <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
18 </filter> 18 <filter-mapping> 19 <filter-name>struts2</filter-name>
19 <url-pattern>*.action</url-pattern>
20 </filter-mapping>
21 </web-app>
知识点一
数据封装: 属性封装 模型驱动封装 表达式封装 (注意:在一个action中不能给对同一个表单使用属性封装和模型驱动封装,如果使用只会执行模型驱动封装)
模型驱动封装的实现步骤:
01:创建实体类(属性名必须和表单的name属性值一致)
02:action实现ModelDriven接口
03:实现ModelDriven的接口的getModel方法 如:private 实体类 实体类对象名=new实体类(); public 实体类 getModel(){ return 实体类对象名;}
实体类
1 package com.entity; 2 3 public class ELogin { 4 5 public ELogin(String uname, String upassword) { 6 super(); 7 this.uname = uname; 8 this.upassword = upassword; 9 } 10 11 public ELogin() { 12 super(); 13 // TODO Auto-generated constructor stub 14 } 15 private String uname; 16 private String upassword; 17 18 public String getUname() { 19 return uname; 20 } 21 public void setUname(String uname) { 22 this.uname = uname; 23 } 24 public String getUpassword() { 25 return upassword; 26 } 27 public void setUpassword(String upassword) { 28 this.upassword = upassword; 29 } 30 31 32 }
Action类
1 public class LoginAction extends ActionSupport implements ModelDriven<ELogin> { 2 3 public String admin() { 4 System.out.println(elogin.getUname() + "_____________" + elogin.getUpassword()); 5 return NONE; 6 } 7 8 //实例化实体 9 private ELogin elogin = new ELogin(); 10 11 /** 12 * 模型驱动封装 13 */ 14 @Override 15 public ELogin getModel() { 16 // TODO Auto-generated method stub 17 return elogin; 18 } 19 20 }
JSP页面
1 <body> 2 <form action="loginadmin.action" method="post"> 3 用户名:<input name="uname"> 4 密 码:<input type="password" name="upassword"> 5 <input type="submit" value="提交"> 6 </form> 7 </body>
表达式封装的实现步骤:
01:在Action类中声明实体类:private 实体类 实体类对象名;
02:生成实体类对象名的set和get的方法
03:修改表单属性值:name="实体类对象名.属性名"(users.username)
Action类
package com.action; import com.entity.ELogin; import com.opensymphony.xwork2.ActionSupport; public class Login2Action extends ActionSupport{ public String admin() { System.out.println(elogin.getUname() + "_____________" + elogin.getUpassword()); return NONE; } /** * 表达式封装 */ private ELogin elogin; public ELogin getElogin() { return elogin; } public void setElogin(ELogin elogin) { this.elogin = elogin; } }
讲了这么多肯定有人在想表达式封装和模型封装之间有什么区别 下面就讲讲它们之间的区别:
表达式封装和模型封装的相同点以及不同点
相同点:简单的说都可以把数据封装到实体类中
不同点:模型驱动封装只能够把数据封装到一个实体类中,在一个action里面只能实现一次ModelDriven的接口所以模型封装只会封装一个到一个实体类中,而表达式封装可以把数据封装到多个对象中.
知识点二
OGNL表达式写法
说道ognl表达式,我们可能会想到El表达式,对它们都是很强的表达式语言,但是El表达式在Struts1中比较常用的,Struts2则默认使用了OGNL表达式,结合Struts2的标签库,完成了页面的数据绑定.说道这就给大家简单说说Struts1和Struts2的区别
Struts1和Struts2的区别?
都是MVC的WEB框架,Struts1是一个老的框架,当应用很广泛,有很好的群众基础,使用它开发风险很小,成本低,那为什么要用Struts2呢?Struts2毕竟是站在前辈的基础设计出来,它会改善Struts1中的一些缺陷,Struts1中一些问题在Struts2中能得到解决.
回归正题 OGNL表达式的使用 先导入Struts2的标签库 <%@ taglib uri="/struts-tags" prefix="s"%> 使用标签库 <s:property value="'haha'.Length()"/>
知识点三 值栈
什么是值栈?
Struts2里面本身提供的一种存储机制,类似于域对象,值栈,可以存值和取值.
action和servlet区别?
每次访问action的时候,都会创建一个新的action对象,而servlet只能有一个对象.
怎么获取值栈的对象 如图:
action类
package com.action;
import java.security.KeyStore.PrivateKeyEntry;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.ServletActionContext;
import com.entity.Person;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.util.ValueStack;
public class IndexAction extends ActionSupport{
private String name;
public String getName() {
return name;
}
@Override
public String execute() throws Exception {
// // 1 获取值栈对象
ActionContext actionContext=ActionContext.getContext();
//v1值栈对象 存于action对象中
//每一次访问action就会产生一个新的action对象
ValueStack v1=actionContext.getValueStack();
v1.push("PUSH的值");
v1.set("zking", "set的值");
}
}
Jsp 页面
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <%@ taglib prefix="s" uri="/struts-tags" %> 4 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 5 <html> 6 <head> 7 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 8 <title>Insert title here</title> 9 </head> 10 <body> 11 <s:property value="zking"/> 12 <s:debug></s:debug> 13 </body> 14 </html>
值栈的结构?root 结果是list集合 context 结果是map集合
简单讲一下struts2标签库+ognl表达式
基础数据 <s:property value="放入的变量名"/>
对象 <s:property value="对象名.属性名"/>(不要在属性名前面加上get或者set)
List集合三种方法 第一种:<s:property value="集合变量名[下标].属性名"/>
第二种:<s:iterator value="集合变量名">
<s:property value="集合对象的属性名"/>
</s:iterator>
第三种:<s:iterator value="集合变量名" var="元素变量名">
<s:property value="#元素变量名.属性名"/>
</s:iterator>
---恢复内容结束---