java框架之struts(三)

接着上一篇繼續

1、獲取 REQUEST對象和 RESPONSE對象

在struts中也可以獲取servlet包中的request和response對象

修改ProductAction的show方法,獲取request和response對象
訪問頁面 http://127.0.0.1:8080/struts/showProduct

在Tomcat的控制檯輸出 可以看到Struts使用類StrutsRequestWrapper對HttpServletRequest進行了封裝

package com.hjsy.action;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts2.ServletActionContext;

import com.hjsy.bean.Product;

public class ProductAction {
	private Product product;
	 
    public String show() {
    	HttpServletRequest request = ServletActionContext.getRequest();
        HttpServletResponse response = ServletActionContext.getResponse();
 
        System.out.println("request:\t" + request);
        System.out.println("response:\t" + response);
 
        product = new Product();
        product.setName("花季歲月");
        return "show";
       
    }
    public String add(){
        System.out.println("product.name:"+product.getName());
        return "show";
    }
    public Product getProduct() {
        return product;
    }
 
    public void setProduct(Product product) {
        this.product = product;
    }
}


2、獲取SESSION對象

struts中的Session有兩個 
一個是傳統的servlet包下的HttpSession 
另一個是Struts中自己定義的Session 

傳統的servlet包下的session的獲取辦法是: 
ServletActionContext.getRequest().getSession(); 
使用該方法,需要在eclipse的項目中導入servlet-api.jar,該jar包我已經添加在項目lib中了

新的Session的獲取辦法是 
Map m = ActionContext.getContext().getSession(); 
這個session以Map類的形式出現,其中的值和HttpSession中的值是同步的 

3、在ProductAction的add方法中訪問Session

在add方法中獲取Struts定義的Session

Map m = ActionContext.getContext().getSession();

然後把name放進去

package com.hjsy.action;

import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts2.ServletActionContext;

import com.hjsy.bean.Product;
import com.opensymphony.xwork2.ActionContext;

public class ProductAction {
	private Product product;

	public String show() {
		HttpServletRequest request = ServletActionContext.getRequest();
		HttpServletResponse response = ServletActionContext.getResponse();

		System.out.println("request:\t" + request);
		System.out.println("response:\t" + response);

		product = new Product();
		product.setName("花季歲月");
		return "show";

	}

	public String add() {
		System.out.println("product.name:" + product.getName());
		Map m = ActionContext.getContext().getSession();
		m.put("name", product.getName());
		return "show";
	}

	public Product getProduct() {
		return product;
	}

	public void setProduct(Product product) {
		this.product = product;
	}
}
4、在show.jsp中把通過EL表達式把session中的數據取出來
<%@ page language="java" contentType="text/html; charset=UTF-8"
 pageEncoding="UTF-8" isELIgnored="false"%>
 
<%@page isELIgnored="false"%>
 
product.name:${product.name}</br>
session中的name:${name}


5、測試

重啓Tomcat,訪問:http://127.0.0.1:8080/struts/addProduct.jsp



6、如何上傳文件

首先準備 upload.jsp

上傳一定要爲form加上enctype="multipart/form-data",表示提交的數據是二進制的
並且必須是method="post"

使用struts的s:file標籤標識上傳文件框

<s:file name="doc" label="upload" />

這裏name使用doc會和服務端的相應代碼匹配

<%@ page language="java" contentType="text/html; charset=UTF-8"
 pageEncoding="UTF-8" isELIgnored="false"%>
  
<%@page isELIgnored="false" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
  
<html>
<body>
 
<form action="upload" method="post" enctype="multipart/form-data">
 
  上傳文件 : <input type="file" name="doc" /> <br>
  <input type="submit" value="上傳">
</form>
 
</body>
</html>
7、UploadAction.java

在upload.jsp中file字段對應的name是"doc"
所以在action中,必須準備3個屬性,分別是
File doc;
String docFileName;
String docContentType;
屬性名字不能使用其他的,必須基於“doc"
然後爲這3個屬性提供getter setter
8、struts.xml

爲upload路徑配置UploadAction,並返回success.jsp

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
	<constant name="struts.i18n.encoding" value="UTF-8"></constant>
	<package name="basicstruts" extends="struts-default">
		<action name="index">
			<result>index.jsp</result>
		</action>
		<action name="showProduct" class="com.hjsy.action.ProductAction"
			method="show">
			<result name="show">show.jsp</result>
		</action>
		<action name="addProduct" class="com.hjsy.action.ProductAction"
			method="add">
			<result name="show">show.jsp</result>
		</action>
		<action name="upload" class="com.hjsy.action.UploadAction"
			method="upload">
			<result name="success">success.jsp</result>
		</action>
	</package>
</struts>
9、success.jsp

分別顯示doc,docFileName,docContentType

<%@page isELIgnored="false"%>
uploaded success
 
${doc}
<br/>
${docFileName}
<br/>
${docContentType}
<br/>
10、測試

重啓tomcat,訪問頁面,進行文件上傳提交

http://127.0.0.1:8080/struts/upload.jsp

第一行表示上傳後被放在tomcat的work目錄下,並且以.tmp命名

第二行是上傳文件本來的名字

第三行是上傳文件的mime type


11、上傳文件最大值

struts上傳文件的大小默認是比較小的只有2M,可以進行設置

修改struts.xml

設置上傳文件最大大小爲10M

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
	<constant name="struts.i18n.encoding" value="UTF-8"></constant>
	<constant name="struts.multipart.maxSize" value="10240000"/>
	<package name="basicstruts" extends="struts-default">
		<action name="index">
			<result>index.jsp</result>
		</action>
		<action name="showProduct" class="com.hjsy.action.ProductAction"
			method="show">
			<result name="show">show.jsp</result>
		</action>
		<action name="addProduct" class="com.hjsy.action.ProductAction"
			method="add">
			<result name="show">show.jsp</result>
		</action>
		<action name="upload" class="com.hjsy.action.UploadAction"
			method="upload">
			<result name="success">success.jsp</result>
		</action>
	</package>
</struts>

12、FORM 標籤

與jstl標準標籤庫類似的,struts有專屬標籤庫 
form標籤用於提交數據

修改addProduct.jsp

使用struts標籤庫

<%@ page language="java" contentType="text/html; charset=UTF-8"
 pageEncoding="UTF-8" isELIgnored="false"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
	<!-- 
	<form action="addProduct"  method="post">
	 <input type="text" name="product.name">
	    <br/>
	 <input type="submit" value="submit">
	</form>
	 -->
	<body>
		<s:form action="addProduct">
		  <s:textfield name="product.name" label="product name" />
		  <s:submit value="Submit" />
		</s:form>
	</body>
</html>

13、測試

重啓Tomcat,訪問:http://127.0.0.1:8080/struts/addProduct.jsp

通過瀏覽器查看源碼可以發現,struts把表單裏的內容自動轉換成了table



14、使用S:ITERATOR 標籤遍歷集合

與JSTL標準標籤庫的c:forEach類似的,struts也提供了一個s:iterator用於遍歷一個集合中的數據

爲ProductAction增加list方法

(1)爲ProductAction增加一個products屬性,類型是List,並提供getter setter 
(2) 爲ProductAction增加一個list()方法,爲products添加3個product對象,並返回“list"

package com.hjsy.action;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts2.ServletActionContext;

import com.hjsy.bean.Product;
import com.opensymphony.xwork2.ActionContext;

public class ProductAction {
	private Product product;
	private List<Product> products;
	  
        public List<Product> getProducts() {
            return products;
        }
  
        public void setProducts(List<Product> products) {
            this.products = products;
        }
	public String show() {
		HttpServletRequest request = ServletActionContext.getRequest();
		HttpServletResponse response = ServletActionContext.getResponse();

		System.out.println("request:\t" + request);
		System.out.println("response:\t" + response);

		product = new Product();
		product.setName("花季歲月");
		return "show";

	}
	public String list() {
        products=new ArrayList();
        Product p1 = new Product();
        p1.setId(1);
        p1.setName("product1");
        Product p2 = new Product();
        p2.setId(2);
        p2.setName("product2");
        Product p3 = new Product();
        p3.setId(3);
        p3.setName("product3");
  
        products.add(p1);
        products.add(p2);
        products.add(p3);
  
        return "list";
  
    }
	public String add() {
		System.out.println("product.name:" + product.getName());
		Map m = ActionContext.getContext().getSession();
		m.put("name", product.getName());
		return "show";

	}

	public Product getProduct() {
		return product;
	}

	public void setProduct(Product product) {
		this.product = product;
	}
}

15、struts.xml

配置路徑listProduct,並返回list.jsp

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
	<constant name="struts.i18n.encoding" value="UTF-8"></constant>
	<constant name="struts.multipart.maxSize" value="10240000" />
	<package name="basicstruts" extends="struts-default">
		<action name="index">
			<result>index.jsp</result>
		</action>
		<action name="showProduct" class="com.hjsy.action.ProductAction"
			method="show">
			<result name="show">show.jsp</result>
		</action>
		<action name="addProduct" class="com.hjsy.action.ProductAction"
			method="add">
			<result name="show">show.jsp</result>
		</action>
		<action name="upload" class="com.hjsy.action.UploadAction"
			method="upload">
			<result name="success">success.jsp</result>
		</action>
		<action name="listProduct" class="com.hjsy.action.ProductAction"
			method="list">
			<result name="list">list.jsp</result>
		</action>
	</package>
</struts>

16、list.jsp

使用s:iterator標籤進行遍歷
value 表示集合
var 表示遍歷出來的元素
st 表示遍歷出來的元素狀態
st.index 當前行號 基0
st.count 當前行號 基1
st.first 是否是第一個元素
st.last 是否是最後一個元素
st.odd 是否是奇數
st.even 是否是偶數

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8" isELIgnored="false"%>

<%@ taglib prefix="s" uri="/struts-tags"%>

<%@page isELIgnored="false"%>

<style>
table {
	border-collapse: collapse;
}

td {
	border: 1px solid gray;
}
</style>

<table align="center">
	<tr>
		<td>id</td>
		<td>name</td>
		<td>st.index</td>
		<td>st.count</td>
		<td>st.first</td>
		<td>st.last</td>
		<td>st.odd</td>
		<td>st.even</td>

	</tr>

	<s:iterator value="products" var="p" status="st">
		<tr>
			<td>${p.id}</td>
			<td>${p.name}</td>
			<td>${st.index}</td>
			<td>${st.count}</td>
			<td>${st.first}</td>
			<td>${st.last}</td>
			<td>${st.odd}</td>
			<td>${st.even}</td>
		</tr>
	</s:iterator>

</table>
17、測試

重啓tomcat,訪問網頁
http://127.0.0.1:8080/struts/listProduct


18、如何使用CHECKBOXLIST 標籤

遍歷3個product成爲checkbox 
並且第2個和第3個是默認選中的

19、ProductAction.java

除了前例中準備的products
再新增一個屬性ListselectedProducts,用於存放哪些產品被選中了
注意: ListselectedProducts 裏放的是id,而不是對象

package com.hjsy.action;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts2.ServletActionContext;

import com.hjsy.bean.Product;
import com.opensymphony.xwork2.ActionContext;

public class ProductAction {
	private Product product;
	private List<Product> products;
	private List<Integer> selectedProducts;
    public List<Integer> getSelectedProducts() {
        return selectedProducts;
    }
 
    public void setSelectedProducts(List<Integer> selectedProducts) {
        this.selectedProducts = selectedProducts;
    }     
    public List<Product> getProducts() {
        return products;
    }
  
    public void setProducts(List<Product> products) {
        this.products = products;
    }
	public String show() {
		HttpServletRequest request = ServletActionContext.getRequest();
		HttpServletResponse response = ServletActionContext.getResponse();

		System.out.println("request:\t" + request);
		System.out.println("response:\t" + response);

		product = new Product();
		product.setName("花季歲月");
		return "show";

	}
	public String list() {
        products=new ArrayList();
        selectedProducts = new ArrayList();
        Product p1 = new Product();
        p1.setId(1);
        p1.setName("product1");
        Product p2 = new Product();
        p2.setId(2);
        p2.setName("product2");
        Product p3 = new Product();
        p3.setId(3);
        p3.setName("product3");
  
        products.add(p1);
        products.add(p2);
        products.add(p3);
  
        selectedProducts.add(2);
        selectedProducts.add(3);
        return "list";
  
    }
	public String add() {
		System.out.println("product.name:" + product.getName());
		Map m = ActionContext.getContext().getSession();
		m.put("name", product.getName());
		return "show";

	}

	public Product getProduct() {
		return product;
	}

	public void setProduct(Product product) {
		this.product = product;
	}
}
20、list.jsp

使用s:checkboxlist標籤
value:哪些被選中
name:提交到服務端用的名稱
list:用於遍歷的集合
listValue:顯示的checkbox的名稱
listKey:checkbox的value

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8" isELIgnored="false"%>

<%@ taglib prefix="s" uri="/struts-tags"%>

<%@page isELIgnored="false"%>
<style>
table {
	border-collapse: collapse;
}

td {
	border: 1px solid gray;
}
</style>

<table align="center">
	<tr>
		<td>id</td>
		<td>name</td>
		<td>st.index</td>
		<td>st.count</td>
		<td>st.first</td>
		<td>st.last</td>
		<td>st.odd</td>
		<td>st.even</td>

	</tr>

	<s:iterator value="products" var="p" status="st">
		<tr>
			<td>${p.id}</td>
			<td>${p.name}</td>
			<td>${st.index}</td>
			<td>${st.count}</td>
			<td>${st.first}</td>
			<td>${st.last}</td>
			<td>${st.odd}</td>
			<td>${st.even}</td>
		</tr>
	</s:iterator>
</table>
<s:checkboxlist value="selectedProducts" name="product.id"
    	list="products" listValue="name" listKey="id" />
21、測試

重啓tomcat,訪問頁面
http://127.0.0.1:8080/struts/listProduct


22、如何使用<S:RADIO>標籤

遍歷products成爲radio,並選中第二個

23、修改list.jsp

在前例checkbox標籤的基礎上增加s:radio標籤
value表示:哪項被選中
name表示:提交到服務端用的名稱
list:用於遍歷的集合
listValue:顯示的radio的名稱
listKey:radio的value

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8" isELIgnored="false"%>

<%@ taglib prefix="s" uri="/struts-tags"%>

<%@page isELIgnored="false"%>
<style>
table {
	border-collapse: collapse;
}

td {
	border: 1px solid gray;
}
</style>

<table align="center">
	<tr>
		<td>id</td>
		<td>name</td>
		<td>st.index</td>
		<td>st.count</td>
		<td>st.first</td>
		<td>st.last</td>
		<td>st.odd</td>
		<td>st.even</td>

	</tr>

	<s:iterator value="products" var="p" status="st">
		<tr>
			<td>${p.id}</td>
			<td>${p.name}</td>
			<td>${st.index}</td>
			<td>${st.count}</td>
			<td>${st.first}</td>
			<td>${st.last}</td>
			<td>${st.odd}</td>
			<td>${st.even}</td>
		</tr>
	</s:iterator>
</table>
<s:checkboxlist value="selectedProducts" name="product.id"
    list="products" listValue="name" listKey="id" /></br>
<s:radio name="product.id" value="2" list="products" listValue="name"
    listKey="id" />
24、測試

重啓Tomcat,訪問:http://127.0.0.1:8080/struts/listProduct

25、如何使用S:SELECT 標籤

遍歷products成爲select標籤 
默認選中第2個和第3個

26、修改list.jsp

使用s:select標籤
name表示:提交到服務端用的名稱
list:用於遍歷的集合
listKey:每個option的value
listValue:顯示的名稱
multiple:true表示可以選中多行
size="3"表示默認顯示3行
value表示:哪些被選中

注: 可以增加一個屬性 theme="simple" 使得最後生成的最簡單的風格的html,否則就會有一些奇奇怪怪的tr td
或者直接在struts.xml中加一句 Servlet下載文件 
<constant name="struts.ui.theme" value="simple"/>
注: 如果要增加class,需要使用屬性: cssClass

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8" isELIgnored="false"%>

<%@ taglib prefix="s" uri="/struts-tags"%>

<%@page isELIgnored="false"%>
<style>
table {
	border-collapse: collapse;
}

td {
	border: 1px solid gray;
}
</style>

<table align="center">
	<tr>
		<td>id</td>
		<td>name</td>
		<td>st.index</td>
		<td>st.count</td>
		<td>st.first</td>
		<td>st.last</td>
		<td>st.odd</td>
		<td>st.even</td>

	</tr>

	<s:iterator value="products" var="p" status="st">
		<tr>
			<td>${p.id}</td>
			<td>${p.name}</td>
			<td>${st.index}</td>
			<td>${st.count}</td>
			<td>${st.first}</td>
			<td>${st.last}</td>
			<td>${st.odd}</td>
			<td>${st.even}</td>
		</tr>
	</s:iterator>
</table>
<s:checkboxlist value="selectedProducts" name="product.id"
    list="products" listValue="name" listKey="id" /></br>
<s:radio name="product.id" value="2" list="products" listValue="name"
    listKey="id" /></br>
    <s:select label="products"
       name="product.id"
       list="products"
       listKey="id"
       listValue="name"
       multiple="true"
       size="3"
       value="selectedProducts"
/>
27、測試

重啓Tomcat,訪問:http://127.0.0.1:8080/struts/listProduct


源碼:鏈接:https://pan.baidu.com/s/1eT7RuyY 密碼:tilb

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章