日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Struts2学习总结三

發(fā)布時間:2025/3/15 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Struts2学习总结三 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Struts2框架OGNL與文件上傳以及防止表單重復(fù)提交

  • Struts2學(xué)習(xí)總結(jié)三
    • 1、OGNL表達(dá)式
      • 1.1、什么是OGNL。
      • 1.2、OGNL的3個符號。
        • 1.2.1、#符號
          • 1.2.1.1、訪問非root對象
          • 1.2.1.1、用于過濾和投影集合
          • 1.2.1.1、構(gòu)造Map集合
      • 1.3、OGNL的功能。
        • 1.3.1、支持普通方法調(diào)用
        • 1.3.2、訪問靜態(tài)成員(方法,字段)
          • 1.3.2.1、訪問靜態(tài)屬性
          • 1.3.2.2、訪問靜態(tài)方法
          • 1.3.2.3、調(diào)用Math靜態(tài)
        • 1.3.3、操作集合對象
      • 1.4、OGNL常用標(biāo)簽
        • s:iterator標(biāo)簽
        • s:if標(biāo)簽
      • 1.5、不常用標(biāo)簽
    • 2、文件上傳
      • 2.1、文件上傳配置
        • 2.1.1、創(chuàng)建FileUploadAction類
        • 2.1.2、配置文件上傳大小
        • 2.1.3、限制文件上傳類型
        • 2.1.4、限制文件上傳拓展名
        • 2.1.5、編寫index.jsp
        • 2.1.6測試結(jié)果
      • 2.2、文件上傳錯誤消息配置
      • 2.3、多文件上傳
        • 2.3.1、修改FileUploadAction類
        • 2.3.2、修改index.jsp
        • 2.3.3、修改success.jsp
        • 2.3.4、測試
      • 2.4、文件下載
        • 2.4.1、編寫DownloadAction類
        • 2.4.2、編寫download.jsp
        • 2.4.3、編寫struts.xml
        • 2.4.4、測試
    • 3、防止表單重復(fù)提交
    • 至此,所有的Struts2的基本內(nèi)容總結(jié)完畢。那些國際化七七八八的就算了,現(xiàn)在很多企業(yè)都不用Struts2了,還管那些干啥= =!
    • 參考

Struts2學(xué)習(xí)總結(jié)三

其實,寫到這里,Struts2早已經(jīng)被淘汰!雖然面試的時候還會面試有關(guān)于struts2的相關(guān)內(nèi)容。不過開發(fā)已經(jīng)不作為重點了。所以接下在幾個點,就略略的概括掉一下就行了!

今天寫這么幾個點:

  • OGNL表達(dá)式。
  • 文件上傳。
  • 防止表單重復(fù)提交。
  • Struts2的UI標(biāo)簽(這里我就直接放一個別人的博客了)
  • 1、OGNL表達(dá)式

    分幾個點介紹一下:

  • 什么是OGNL。
  • OGNL投影。
  • 支持普通方法調(diào)用
  • 訪問靜態(tài)成員(方法,字段)
  • 操作集合對象
  • OGNL的功能。
  • OGNL常用標(biāo)簽。
  • OGNL其他標(biāo)簽。
  • 1.1、什么是OGNL。

    OGNL(Object-Graph Navigation Language,對象圖導(dǎo)航語言),它是一個功能強大的表達(dá)式語言,用來獲取和設(shè)置Java對象的屬性以及調(diào)用對象的方法。它旨在提供一個更高的更抽象的層次來對Java對象圖進(jìn)行導(dǎo)航。

    OGNL是Struts2的默認(rèn)表達(dá)語言,OGNL表達(dá)式的計算是圍繞OGNL上下文(Context)進(jìn)行的,相當(dāng)于一個Map對象,見下圖的結(jié)構(gòu):

    可以看到值棧是root。

    1.2、OGNL的3個符號。

    OGNL中重要的3個符號:#、%、$。

    1.2.1、#符號

    有以下三個功能:

  • 訪問非root對象(也就是非值棧)。
  • 用于過濾和投影集合。
  • 構(gòu)造Map集合。
  • 1.2.1.1、訪問非root對象

    例如:

    <!-- 等同于${sessionScope.user} --> <s:property value="#session.user"/> <!-- 等同于${requestScope.user} --> <s:property value="#request.user"/>
    1.2.1.1、用于過濾和投影集合

    例如(下面的那個標(biāo)簽類似于c:foreach):

    <!-- 三種表現(xiàn)形式:1. ?#:滿足條件的所有2. ^#:滿足條件的第一條3. $#:滿足條件的最后一條--><!-- 假設(shè)有一個List<User>的集合名為userList并且User有一個age的屬性--><!-- value=""等價于c:foreach的items --><!-- OGNL過濾集合的語法為:collection.{?expression} --> <s:iterator value="userList.{?#this.age>17}"><!-- 篩選出大于17歲也就是大于等于18歲的人的用戶集合 --> </s:iterator> <!-- 其他兩個同理 -->
    1.2.1.1、構(gòu)造Map集合

    例如:

    <s:radio list="#{'male':'','female':''}" />

    1.3、OGNL的功能。

    有下面幾個功能:

  • 支持普通方法調(diào)用
  • 訪問靜態(tài)成員(方法,字段)
  • 操作集合對象
  • 1.3.1、支持普通方法調(diào)用

    例如:

    <s:property value="'hello'.length()"/>

    1.3.2、訪問靜態(tài)成員(方法,字段)

    在使用靜態(tài)之前,需要在struts.xml文件中配置這個常量值:<constant name="struts.ognl.allowStaticMethodAccess" value="true"/>。

    1.3.2.1、訪問靜態(tài)屬性
    /* 訪問靜態(tài)屬性表達(dá)式的格式為:@[類全名(包括包路徑)]@[值名] */ <s:property value="@包路徑.類名@字段名"/>
    1.3.2.2、訪問靜態(tài)方法
    /* 調(diào)用靜態(tài)方法表達(dá)式的格式為:@[類全名(包括包路徑)]@[方法名] */ <s:property value="@包路徑.類名@方法名(參數(shù)...)"/>
    1.3.2.3、調(diào)用Math靜態(tài)
    <s:property value="@@max(2, 3)" />

    1.3.3、操作集合對象

    <!-- 假設(shè)值棧中,存在一個List<User>的集合對象,名為userList --> <s:property value="userList[0].username"/> <s:property value="userList[1].username"/><!-- 或者值棧中還存在一個Map<String,String>的集合對象,名為map其中有這樣的鍵值對:"hello"-"world","struts1"-"struts2"--> <s:property value="map.struts1"/> <s:property value="map.['hello']"/><!-- 訪問map中所有的key和value --> <s:property value="map.keys"/> <s:property value="map.values"/>

    1.4、OGNL常用標(biāo)簽

    s:iterator標(biāo)簽

    <!-- 迭代標(biāo)簽假設(shè)值棧中有一個List<User>,名為userList。--> <s:iterator value="userList" var="user" status="s">索引:<s:property value="#s.index"/> 數(shù)量:<s:property value="#s.count"/> 是否奇數(shù):<s:property value="#s.odd"/> 是否偶數(shù):<s:property value="#s.even"/>用戶名:<s:property value="#user.username"/> </s:iterator>

    s:if標(biāo)簽

    <s:if test="userList[9]!=null">值棧中的userList第10個元素不為空 </s:if> <s:elseif test="userList!=null">值棧中的userList不為空 </s:elseif> <s:else>值棧中的userList為空 </s:else>

    1.5、不常用標(biāo)簽

    • s:set標(biāo)簽
    • s:action標(biāo)簽
    • s:url標(biāo)簽
    • s:a標(biāo)簽
    • 等…

    2、文件上傳

    分下面幾點說明:

  • 文件上傳配置。
  • 文件上傳錯誤消息配置。
  • 多文件上傳。
  • 文件下載。
  • 2.1、文件上傳配置

    以下幾步:

  • 創(chuàng)建FileUploadAction類。
  • 配置文件上傳大小。
  • 限制文件上傳類型。
  • 限制文件上傳拓展名。
  • 編寫index.jsp。
  • 2.1.1、創(chuàng)建FileUploadAction類

    package com.csa.action;import java.io.File; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport;public class FileUploadAction extends ActionSupport {// 創(chuàng)建getter/setter方法,說明存入值棧中!private String url;// 下面三個字段都是upload.jar提供的,struts要求必須這樣寫!// 上傳的文件private File img;// 文件名,固定寫法 文件變量名+FileNameprivate String imgFileName;// 文件類型,固定寫法 文件變量名+ContentTypeprivate String imgFileContentType;public String upload() {// 1.存儲路徑String dir = ServletActionContext.getServletContext().getRealPath("/WEB-INF/files");File file = new File(dir);if (!file.exists()) {file.mkdirs();}// 2.存儲img.renameTo(new File(file, imgFileName));url = dir + File.separator + imgFileName;return SUCCESS;}public File getImg() {return img;}public void setImg(File img) {this.img = img;}public String getImgFileName() {return imgFileName;}public void setImgFileName(String imgFileName) {this.imgFileName = imgFileName;}public String getImgFileContentType() {return imgFileContentType;}public void setImgFileContentType(String imgFileContentType) {this.imgFileContentType = imgFileContentType;}public String getUrl() {return url;}public void setUrl(String url) {this.url = url;}}

    2.1.2、配置文件上傳大小

    在struts.xml中配置:<constant name="struts.multipart.maxsize" value="10485760"></constant>

    <?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><!-- 開發(fā)模式 --><constant name="struts.devMode" value="true"></constant><!-- 配置文件上傳大小 --><!-- 10MB --><constant name="struts.multipart.maxsize" value="10485760"></constant><package name="upload" extends="struts-default" namespace="/"><action name="*" class="com.csa.action.FileUploadAction" method="{1}"><result name="success">/success.jsp</result></action></package> </struts>

    2.1.3、限制文件上傳類型

    這個還不太懂。

    2.1.4、限制文件上傳拓展名

    這個也還不太懂。

    2.1.5、編寫index.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%> <%@ taglib prefix="s" uri="/struts-tags"%> <!DOCTYPE html> <html><head><title>上傳頁面</title></head><body><form method="post" action="${pageContext.request.contextPath}/upload.action" enctype="multipart/form-data">上傳文件:<input type="file" name="img"/><br/><input type="submit" value="上傳"/></form></body> </html>

    success.jsp頁面:

    <%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html><head><title>上傳成功</title></head><body><h1>路徑:${url}</h1></body> </html>

    2.1.6測試結(jié)果

    2.2、文件上傳錯誤消息配置

    這個也不太懂。

    2.3、多文件上傳

    修改兩處地方:

  • 修改FileUploadAction類。
  • 修改index.jsp。
  • 修改success.jsp。
  • 測試
  • 2.3.1、修改FileUploadAction類

    package com.csa.action;import java.io.File; import java.util.ArrayList; import java.util.List;import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport;public class FileUploadAction extends ActionSupport {// 創(chuàng)建getter/setter方法,說明存入值棧中!private List<String> urlList;// 下面三個字段都是upload.jar提供的,struts要求必須這樣寫!// 上傳的文件private File[] img;// 文件名,固定寫法 文件變量名+FileNameprivate String[] imgFileName;// 文件類型,固定寫法 文件變量名+ContentTypeprivate String[] imgFileContentType;public String upload() {// 1.存儲路徑String dir = ServletActionContext.getServletContext().getRealPath("/WEB-INF/files");File file = new File(dir);if (!file.exists()) {file.mkdirs();}urlList = new ArrayList<>();// 2.存儲for (int i=0;i<img.length;i++) {img[i].renameTo(new File(file, imgFileName[i]));urlList.add(dir + File.separator + imgFileName[i]);}return SUCCESS;}public List<String> getUrlList() {return urlList;}public void setUrlList(List<String> urlList) {this.urlList = urlList;}public File[] getImg() {return img;}public void setImg(File[] img) {this.img = img;}public String[] getImgFileName() {return imgFileName;}public void setImgFileName(String[] imgFileName) {this.imgFileName = imgFileName;}public String[] getImgFileContentType() {return imgFileContentType;}public void setImgFileContentType(String[] imgFileContentType) {this.imgFileContentType = imgFileContentType;}}

    2.3.2、修改index.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%> <%@ taglib prefix="s" uri="/struts-tags"%> <!DOCTYPE html> <html><head><title>上傳頁面</title></head><body><form method="post" action="${pageContext.request.contextPath}/upload.action" enctype="multipart/form-data">上傳文件1:<input type="file" name="img"/><br/>上傳文件2:<input type="file" name="img"/><br/><input type="submit" value="上傳"/></form></body> </html>

    2.3.3、修改success.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%> <%@ taglib prefix="s" uri="/struts-tags"%> <!DOCTYPE html> <html><head><title>上傳成功</title></head><body><s:iterator value="urlList" var="url"><h1>路徑:${url}</h1><!-- ${url}與<s:property value="#url"/>是等價的!--></s:iterator></body> </html>

    2.3.4、測試

    2.4、文件下載

    分下面幾步:

  • 編寫DownloadAction類。
  • 編寫download.jsp。
  • 編寫struts.xml。
  • 測試。
  • 2.4.1、編寫DownloadAction類

    package com.csa.action;import java.io.File; import java.io.FileInputStream; import java.io.InputStream;import org.apache.struts2.ServletActionContext;import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport;public class DownLoadAction extends ActionSupport {// 文件名private String fileName;// 文件路徑private static String dir = ServletActionContext.getServletContext().getRealPath("/WEB-INF/files");;// 需要一個文件輸入流private InputStream fileInputStream;public String download() throws Exception {fileInputStream = new FileInputStream(new File(dir + File.separator + fileName));return "success";}public String downloadPage() {File file = new File(dir);String[] listFiles = file.list();ActionContext.getContext().getValueStack().set("listFiles", listFiles);return "DLpage";}public String getFileName() {return fileName;}public void setFileName(String fileName) {this.fileName = fileName;}public InputStream getFileInputStream() {return fileInputStream;}public void setFileInputStream(InputStream fileInputStream) {this.fileInputStream = fileInputStream;}}

    2.4.2、編寫download.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%> <%@ taglib prefix="s" uri="/struts-tags"%> <!DOCTYPE html> <html><head><title>下載頁面</title></head><body><s:iterator value="listFiles" var="file"><a href='${pageContext.request.contextPath}/download.action?fileName=<s:property value="#file"/>'><s:property value="#file"/></a><br/></s:iterator></body> </html>

    2.4.3、編寫struts.xml

    <?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><!-- 開發(fā)模式 --><constant name="struts.devMode" value="true"></constant><package name="download" extends="struts-default" namespace="/"><action name="*" class="com.csa.action.DownLoadAction" method="{1}"><!-- 其實action中也可以依賴注入DI --><!-- <param name="某個擁有g(shù)et/set的字段"></param> --><!-- 下載其實就是一個流 --><result name="success" type="stream"><!-- 需要一個流對象 --><param name="inputName">fileInputStream</param><!-- 需要一個下載的文件名 --><!-- 這里可以使用特定的表達(dá)式,比如$或者OGNL --><param name="contentDisposition">attachment;filename=${fileName}</param><!-- 需要指定下載的類型 --><param name="contentType">application/octet-stream</param></result><result name="DLpage">/download.jsp</result></action></package></struts>

    2.4.4、測試

    3、防止表單重復(fù)提交

    就只有一點(常用,方便):

  • 在index.jsp的form表單中添加一個<s:token/>。
  • 在struts.xml中添加一個<intercptor-ref name="tokenSession"></intercptor-ref>即可。

  • 至此,所有的Struts2的基本內(nèi)容總結(jié)完畢。那些國際化七七八八的就算了,現(xiàn)在很多企業(yè)都不用Struts2了,還管那些干啥= =!


    參考

    實驗樓Struts2教程
    黑馬筆記。

    總結(jié)

    以上是生活随笔為你收集整理的Struts2学习总结三的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 国产性猛交96 | 亚洲综合色自拍一区 | 久久久久人妻一区二区三区 | 对白刺激theporn | 风间由美av | 99久久婷婷国产综合精品青牛牛 | 久久久精品中文字幕 | 天天色天天干天天色 | 久久久亚洲精品视频 | 国产精品无码中文字幕 | 日韩精品手机在线 | 精品乱码一区内射人妻无码 | 亚洲日本欧美在线 | av观看网站| 亚洲综合av一区二区三区 | 最新在线中文字幕 | 国产精品s | av女优一区 | 亚洲高清av在线 | 99精品国产成人一区二区 | 亚洲激情a | 操天天| 肥臀av| 亚洲第一免费视频 | 日韩av一级片 | 91污片| 国产精品传媒一区二区 | 91玉足脚交嫩脚丫在线播放 | 国产不卡一 | 最新av网址在线观看 | 日本一区二区三区视频免费看 | 亚洲欧美伦理 | 欧美另类视频在线观看 | 毛片内射久久久一区 | 欧美a级肉欲大片xxx | 精品乱子伦一区二区三区 | 成人精品免费网站 | 狠狠久久久| 又大又长粗又爽又黄少妇视频 | 国产一区在线观看视频 | 亚洲天堂少妇 | 91精品国产入口在线 | 日本一区视频 | 全部免费毛片在线播放高潮 | 成人3d动漫一区二区三区91 | 天海翼视频在线观看 | 黄色一级免费视频 | 欧美理伦少妇2做爰 | 嫩草网站入口 | 成人自拍偷拍 | 日本h视频在线观看 | 天天干视频在线 | 黄色片久久久 | 能免费看18视频网站 | 超碰免费公开 | 夜夜嗨aⅴ一区二区三区 | 日本一级片在线观看 | 国产日韩在线免费观看 | 91禁动漫在线 | 伊人中文字幕 | 性欧美成人播放77777 | 亚洲国产成人精品女人久久 | 国产专区一区二区 | 在线免费看黄色片 | 天堂av资源在线 | 久久久久99精品成人片三人毛片 | 先锋资源一区 | 五月天综合激情网 | 校霸被c到爽夹震蛋上课高潮 | 欧美大胆视频 | 青青草99 | 亚洲精品 日韩无码 | 日本免费成人 | 又黄又骚又爽 | 女性裸体无遮挡胸 | 激情欧美在线 | 亚洲少妇视频 | 日本亚洲网站 | 少妇闺蜜换浪荡h肉辣文 | ass日本寡妇pics | 国产精品传媒视频 | 欧美在线观看a | 亚洲人成免费 | 国内自拍在线观看 | 中文字幕二区在线观看 | 99国产超薄肉色丝袜交足 | 亚洲国产清纯 | 精品无码一区二区三区蜜臀 | 亚洲综合影院 | 欧美午夜精品久久久 | 男人吃奶视频 | 国产九色视频 | 97人妻精品一区二区三区免 | 国产一av| 国产乱人伦精品 | 黑丝少妇喷水 | 国内毛片毛片 | 99热国产在线 | 国产一区二区在线视频观看 |