Struts2框架--学习笔记(上):搭建struts2工程、struts2基本概念、struts2对页面数据的操作
概述:
Struts2框架應用于javaee三層框架中的web層。是在Struts1和webwork基礎上發張的一個全新的框架。
?
一、搭建一個最基本的struts2工程步驟:
1、導入基本的jar包依賴:
2、創建action:
首先:比較一下servlet和struts2的action的區別:
(1)每次訪問servlet的時候,都會執行service方法。
寫類繼承httpServlet,重寫里面的方法。并在web.xml文件配置servlet的訪問路徑。
(2)每次執行action,默認執行execute的方法。
//action類 public class HelloAction {//每次訪問action的時候,默認執行execute方法。public String execute(){return "success";} }3、配置action類的訪問路徑:
(1)創建struts2核心配置文件,核心配置文件名稱和位置是固定的,位置必須在src下面,名稱是struts.xml;
(2)在struts.xml引入dtd約束;
(3)Action配置:
<?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"> <!-- 以上為引入的dtd約束 --> <struts><!-- action的配置 --><package name="HelloDemo" extends="struts-default" namespace="/"><!-- name:配置訪問路徑 --><action name="hellotest" class="com.zwp.action.HelloAction" method="execute"><!-- 配置方法的返回值到頁面 --><result name="ok" type="dispatcher">/hello.jsp</result></action></package> </struts>4、在web.xml配置文件配置過濾器:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://java.sun.com/xml/ns/javaee"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"version="2.5"><display-name>ssh-test</display-name><!-- 配置struts2過濾器 --><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>5、訪問路徑:http://localhost:8080/ssh-test/hellotest
至此,一個最基本的struts2項目就已經搭建完畢。
?
?
二、Struts2的基本概念:
1、Struts2的基本執行流程:
2、structs2的過濾器在服務端啟動的時候創建,創建的時候會執行init方法,init方法中主要加載配置文件,包含自己創建的配置文件和struts自帶文件。
?
3、Struts2核心配置文件:
文件名稱和位置固定;在配置文件中主要有三個標簽package、action、result,以及標簽里面的屬性。
(1)package標簽:
<package name="HelloDemo" extends="struts-default" namespace="/">類似于代碼包,區別不同的action,必須首先寫package標簽,在package里面才能配置action。
package標簽屬性:
①name:name屬性值跟功能本身沒有關系。
②extends:extends="struts-default",屬性值是固定的,struts-default。寫了這個屬性之后,在package里面的類具有action功能。
③namespace:namespace屬性值和action標簽里面的name屬性值構成訪問路徑。
(2)action標簽:
<action name="hellotest" class="com.zwp.action.HelloAction" method="execute">action標簽配置action訪問路徑:
action標簽屬性:
①name:package標簽的namespace屬性值和action標簽里面的name屬性值構成訪問路徑。在package標簽里面可以寫多個action標簽,但是action標簽的屬性值不能相同。
②class:action的全路徑。
③method:在action里面默認執行的方法execute方法,如果想執行action里面的其他方法,使用method進行配置。
(3)result標簽:
<result name="ok" type="dispatcher">/hello.jsp</result>根據action的方法的返回值,配置到不同的路徑里面。
result屬性:
①name:和方法返回值一樣。
②type(重點):配置如何到路徑中(轉發或者重定向)。
---type屬性默認值是做轉發操作,值是dispatcher。
---做重定向操作,值是redirect。
--上面兩個值一般針對到頁面中的配置,如果想要配置到其他的action:
--chain:轉發到action,一般不用,存在緩存問題
--redirectAction:重定向到action。
?
4、action的編寫方式:
(1)第一種:創建普通類,這個類不能繼承任何累,不實現任何接口。
(2)第二種:創建類,實現接口Action
(3)第三種:創建類,繼承ActionSupport(一般使用這個方式)
5、訪問action的方法(重點):
(1)第一種:使用action標簽的method屬性,在這個屬性里面寫執行的action的方法。
(2)第二種:使用通配符方式實現(重點):
(3)第三種:動態訪問實現(不用)
<!--訪問action的三種方法(重點): --><!-- 第一種:使用action標簽的method屬性,在這個屬性里面寫執行的action的方法。 --><!-- name: 訪問名稱 method:默認為execute --><action name="addAction" class="com.zwp.action.HelloAction" method="add"></action><action name="updateAction" class="com.zwp.action.HelloAction" method="update"></action><!-- 第二種:使用通配符方法實現(重點) --><!-- *:是訪問名稱; {1}:第一個*的內容 --><action name="action_*" class="com.zwp.action.HelloAction" method="{1}"></action>①在action里面的方法,如果有返回值得時候類型必須是String。
②action里面的方法可以沒有返回值,沒有返回值的時候,在result標簽不需要配置。
--把方法寫成void
--讓返回值,返回“none”。
6、結果頁面配置:(struts.xml文件)
有兩種配置方式,全局結果以及局部結果頁面,同時配置兩個的話,只有局部結果頁面生效。
(1)全局結果頁面配置:如果多個action的返回值相同,跳轉的頁面也相同,則可以使用全局結果頁面配置。
<!-- 全局結果頁面配置:只適用于同一個package里面的action --> <global-results><result name="success">/hello.jsp</result> </global-results>(2)局部結果頁面配置:
<action name="hellotest" class="com.zwp.action.HelloAction" method="execute"><!-- result標簽配置方法的返回值到頁面 --><result name="ok" type="dispatcher">/hello.jsp</result> </action>?
?
三、Struts2對頁面數據的操作:
1、獲取表單提交的數據:
(1)在web階段,提交表單到servlet里面,在servlet里面使用request對象里面的方法獲取,getParameter,getParameterMap。
(2)提交表單到action,但是action沒有request對象,不能直接使用request對象。
(3)action獲取表單提交數據主要的三種方式:
①使用ActionContext:
public class Form1DemoAction extends ActionSupport {public String execute() throws Exception{//獲取表單提交數據第一種方式 :使用ActionContext類獲取//1.獲取ActionContext對象ActionContext context=ActionContext.getContext();//2.調用對象方法得到表單數據//key是表單輸入項name屬性值,value是輸入的值Map<String,Object> map=context.getParameters();Set<String> keys=map.keySet();for(String key:keys){//根據key得到value//數組形式,因為輸入項可能有復選框的形式Object[] obj=(Object[])map.get(key);System.out.println(Arrays.toString(obj)); }return NONE;} }②使用ServletActionContext:
public String execute() throws Exception{//獲取表單提交數據第二種方式 :使用ServletActionContext類獲取//1.獲取ServletActionContext對象HttpServletRequest request=ServletActionContext.getRequest();//2.調用request的得到表單數據String username=request.getParameter("username");String password=request.getParameter("password");String address=request.getParameter("address");System.out.println(username+":"+password+":"+address);return NONE;}③:使用接口注入(了解):
public class Form3DemoAction extends ActionSupport implements ServletRequestAware{//獲取表單提交數據:第三種方式 :使用接口注入private HttpServletRequest request;@Overridepublic void setServletRequest(HttpServletRequest request) {this.request=request; }public String execute() throws Exception{ String username=request.getParameter("username");String password=request.getParameter("password");String address=request.getParameter("address");System.out.println(username+":"+password+":"+address);return NONE;} }④struts.xml配置:
<!-- 獲取表單提交的數據: --> <action name="form1" class="com.zwp.action.Form1DemoAction"></action> <action name="form2" class="com.zwp.action.Form2DemoAction"></action> <action name="form3" class="com.zwp.action.Form3DemoAction"></action>頁面:
<body><form action="${pageContext.request.contextPath }/form1.action" method="post">username:<input type="text" name="username"/><br/>password:<input type="text" name="password"/><br/>address:<input type="text" name="address"/><br/><input type="submit" value="添加"/></form> </body>?
2、在aciton中操作域對象:
(1)request、session、servletContext:
(2)使用SetvletActionContext:
public String execute() throws Exception{ //在action操作域對象//操作的三個域對象//1.request域HttpServletRequest request=ServletActionContext.getRequest();request.setAttribute("req","reqValue");//2.session域HttpSession session=request.getSession();session.setAttribute("ses", "sesValue");//3.ServletContext域ServletContext servletcontext=ServletActionContext.getServletContext();servletcontext.setAttribute("con", "conValue");return NONE;}?
3、獲取表單提交數據封裝到實體類中去:
(1)原始方式獲取表單數據封裝到實體類中去:
//獲取表單數據封裝到實體類對象中去: public class Form4DemoAction extends ActionSupport{public String execute() throws Exception{//第一種方式:最原始的方式://1.獲取表單數據HttpServletRequest request=ServletActionContext.getRequest();String username=request.getParameter("username");String password=request.getParameter("password");String address=request.getParameter("address");//2.封裝到實體類中去:User user=new User();user.setUsername(username);user.setPassword(password);user.setAddress(address);System.out.println(user.toString());return NONE;} }(2)屬性封裝:獲取表單數據到屬性里面,不能把數據直接封裝到實體類對象里面:
//獲取表單數據封裝到實體類對象中去: public class Form5DemoAction extends ActionSupport{//第二種方式:屬性封裝://1.定義成員變量:成員變量的名字必須和提交的數據name屬性名一樣:private String username;private String password;private String address;//2.生成set和get方法:public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}public String execute() throws Exception{System.out.println(username+":"+password+":"+address);return NONE;} }(3)模型驅動封裝(重點):
①使用模型驅動方式,可以直接把表單數據封裝到實體類對象里面。
要求:表單輸入項的name屬性值和實體類屬性的名稱一樣。
②步驟:
--在action里面接口ModelDriven
--在action里面創建實體類對象
--實現接口里面的getMddel()方法,把對象返回。
//獲取表單數據封裝到實體類對象中去: //第三種方式:驅動封裝:(重點)//1.實現ModelDriven接口: public class Form6DemoAction extends ActionSupport implements ModelDriven<User> {//2.創建對象//前提要求:表單輸入項的name屬性值要和實體類屬性名稱一樣User user=new User();//3.實現接口里面的getModel方法,并把對象返回@Overridepublic User getModel() { return user;}public String execute(){ System.out.println(user.toString());return NONE;} }在一個action中,獲取表單數據可以使用屬性封裝,也可以使用模型驅動封裝,但是不能同時使用屬性封裝和模型驅動封裝獲取同一個表單數據。如果同時使用,只會執行模型驅動。
(4)表達式封裝:數據封裝到對象中去:
①第一步:在action里面聲明實體類;
②第二步:生成實體類變量的set和get方法。
//1.聲明實體類 private User user; //2.生成實體類變量的set和get方法 public User getUser(){return user; } public void setUser(User user){this.user=user; }③第三步:在表單輸入項的name屬性值里面寫表達式形式:
(5)比較表達式封裝和模型驅動封裝:
①使用表達式封裝和模型驅動封裝都可以把數據封裝到實體類對象那個里面
②不同點:
--使用模型驅動只能把數據封裝到一個實體類對象里面;在一個action里面不能使用模型驅動把數據封裝到不同的實體類對象里面。
--使用表達式封裝可以把數據封裝到不同的實體類對象里面。
?
4、封裝數據到List集合:
(1)在action聲明List:
(2)生成List變量的set和get方法
//封裝數據到list: public class ListDemoAction extends ActionSupport {//1.聲明List集合:private List<User> list;//2.生成集合的set和get方法:public List<User> getList() {return list;}public void setList(List<User> list) {this.list = list;}public String execute(){System.out.println(list);return NONE; } }(3)在表單輸入項寫表達式:
<!-- 封裝數據到List集合 --><!-- 3.在表單輸入項寫表達式: --><form action="${pageContext.request.contextPath }/list.action" method="post"><!-- 表示第一個User對象 -->username:<input type="text" name="list[0].username"/><br/>password:<input type="text" name="list[0].password"/><br/>address:<input type="text" name="list[0].address"/><br/><br/><!-- 表示第二個User對象 -->username:<input type="text" name="list[1].username"/><br/>password:<input type="text" name="list[1].password"/><br/>address:<input type="text" name="list[1].address"/><br/><input type="submit" value="添加"/></form>?
5、封裝數據到Map集合:
(1)在action聲明map;
(2)生成map變量的set和get方法:
//封裝數據到Map集合: public class MapDemoAction extends ActionSupport {//1.在action中聲明Mapprivate Map<String,User> map;//2.生成Map變量的set和get方法:public Map<String, User> getMap() {return map;}public void setMap(Map<String, User> map) {this.map = map;}public String execute(){System.out.println(map);return NONE;} }(3)在表單輸入項寫表達式:
<!-- 封裝數據到Map集合 --><!-- 3.在表單輸入項寫表達式: --><form action="${pageContext.request.contextPath }/map1.action" method="post"><!-- 表示第一個User對象 -->username:<input type="text" name="map['one'].username"/><br/>password:<input type="text" name="map['one'].password"/><br/>address:<input type="text" name="map['one'].address"/><br/><br/><!-- 表示第二個User對象 -->username:<input type="text" name="map['two'].username"/><br/>password:<input type="text" name="map['two'].password"/><br/>address:<input type="text" name="map['two'].address"/><br/><input type="submit" value="添加"/></form>?
?
總結
以上是生活随笔為你收集整理的Struts2框架--学习笔记(上):搭建struts2工程、struts2基本概念、struts2对页面数据的操作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Hibernate框架--学习笔记(下)
- 下一篇: Struts2框架--学习笔记(下):O