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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Struts2.0第三章(文件上传、ajax开发、json、Fastjson、Jackson、注解开发)

發布時間:2024/4/17 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Struts2.0第三章(文件上传、ajax开发、json、Fastjson、Jackson、注解开发) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Struts2.0文件上傳:

瀏覽器端注意事項:

  1.表單提交方式method = post;

  2.表單中必須有一個<input type="file" name = "upload">組件;

  3.表單中必須設置enctype="multipart/form-data";

服務器端:

  Commons-fileupoad.jar?

Struts2文件上傳實現:

  strust2框架是使用一個fileupload的interceptor來完成文件上傳,而我們要使用它:

  1.在action中我們可以提供類似一下的操作就能完成文件上傳操作:

public UploadAction extends ActionSupport{private File upload;  //上傳的文件private String uploadContentType;  //上傳文件的mimeTypeprivate String uploadFilename;  //上傳文件的文件名
  //對以上三個屬性實現get/set方法; }

?

    注意:以上示例中的三個屬性名稱之間是有嚴格的命名規范的,upload名稱需要同前端表單<input type="file">組件中的name屬性值保持相同;第二個和第三個成員變量命名遵循第一個成員變量名稱+自身的名稱(ContentType/Filename);

  2.在Action的執行方法中將文件copy就可以完成文件上傳。(strtus2.0框架提供了commons-io.jar包中有一個名為FileUtils的工具類使用它來實現文件copy)

?  FileUtils.copyfile(File srcFile,File destFile);?

Struts2文件上傳注意事項:

  當我們把a.txt文件后綴更改為png后,上傳出現問題,會報500空指針異常,然后我們將action extends ActionSupport,再次上傳又會發現報404錯誤,然后我們將struts2.0中一個常量struts.devMode設置為true表示顯示詳細的錯誤報告,再次上傳會報404錯誤,然后我們分析錯誤提示為沒有定義一個input視圖。分析得:struts2.0默認加載18個intercptor,當這些個intercptor在執行過程中如果出了問題,會將錯誤信息存儲到action中,然后由名為workflow的interceptor執行跳轉到指定的input視圖。(為什么要extends ActionSupport,因為底層會調用ActionSupport中的addActionError等方法來傳遞錯誤信息)這時候我們要查看錯誤信息,就需要在action中配置一個name值為input的result標簽指定一個錯誤頁面,在錯誤頁面中使用<s:actionerror/><s:fielderror/>。。。來查看錯誤信息。

  這時我們看到這么一條信息:

    Request exceeded allowed size limit! Max size allowed is: 2097152 but request was:2283170!

    錯誤信息顯示,上傳的文件信息過大

  在default.properties中有一個常量值為struts.multipart.maxSize = 2097152 (2m)  它是描述上傳文件允許的最大值,這時候我們要在struts.xml中重新定義該常量值覆蓋掉這個常量值即可。

?    eg:<constant name = "struts.multipart.maxSize" value = "20971520"></constant> 這種設置方式為全局設置在整個項目中生效,如果想單獨控制某個action的上傳文件大小或者文件類型,可以在攔截器中定義,如下:

  我們還可以控制文件上傳的類型。。。

    查看FileUploadInterceptor攔截器有如下三個屬性:

      maximumSize(文件大小);allowedTypesSet(文件MimeType類型);allowedExtensionsSet(文件的后綴名)

      我們可以通過設置這三個屬性的值來控制文件上傳的具體屬性:

        eg:

<action><interceptor-ref name = "fileUpload"><param name="maximumSize"></param> <!-- 設置action允許上傳文件的大小 --><param name="allowedtypes"></param> <!-- 設置上傳允許的文件的mimetype類型,多個使用逗號分開 --><param name="allowedtypes"></param> <!-- 設置上傳允許的文件的后綴名,多個使用逗號分開 --></interceptor-ref>
  <interceptor-ref name="defaultStack"></interceptor-ref>  <!-- 因為當我們自行引入攔截器,那么默認的18個攔截器就不會執行,在這里要重新引入即可 -->
</action>

?

如果我們上傳時,允許上傳多個文件,該如何?

  客戶端:多個<input type="file" name=""/>?  多個file組件的name屬性名要保持一致;

  服務器端:

    action中聲明的三個參數類型要變更為數組或者List集合的類型:

      eg:        

public UploadAction extends ActionSupport{private File[] upload;  //上傳的文件private String[] uploadContentType;  //上傳文件的mimeTypeprivate String[] uploadFilename;  //上傳文件的文件名//對以上三個屬性實現get/set方法; }

?

?    action中實現文件copy使用遍歷:

      eg:

public class uploadManyAction extends ActionSupport {private File[] upload;private String[] uploadContentType;private String[] uploadFileName;//對三個屬性實現get/set方法public String execute() {String path = ServletActionContext.getServletContext().getRealPath("/upload");for (int i = 0; i < upload.length; i++) {File dest = new File(path, uploadFileName[i]);FileUtis.copyFile(upload[i],dest);}} }

?

struts2框架的ajax開發:

json結構:

  json就是javascript中的對象和數組,通過這兩種結構可以表示各種復雜的結構;

  1.對象:對象在js中表示為“{ }”括起來的內容,數據結構為{key:value,key:value,...}的鍵值對的結構,在面向對象的語言中,key對象的屬性,value為對應的屬性值,所以取值方法為 對象.key 獲取屬性值,這個屬性值的類型可以是數字,字符串,數組,對象幾種。

  2.數組:數組在js中是中括號"[ ]"括起來的內容,數據結構為["android","javascript","c++",...]取值方式和所有語言中一樣,使用索引取值,字段值的類型可以是數字,字符串,數組,對象幾種。

  對象和數組之間可以嵌套,這樣經果兩種數據結構的組合就形成了復雜的數據結構了。

java中json工具的介紹:(java數據和js數據之間的轉化)

  Fastjson簡單使用介紹:

    先導入fastjson的jar包

    JSONObject.toJSONString(Object javabean);//將一個javabean轉換成json對象;

    JSONArray.toJSONString(List<javabean> javabean);//將一個javabean的list集合轉換成json對象;

    當需要對Date類型的字段進行格式化時需要在該字段上加上如下注釋:

      @JSONField(format="yyyy-MM-dd")

    當需要對數據進行過濾,如某些字段的數據不需要生成:

      使用SerializaFilter接口的實現類PropertyFilter來實現屬性的過濾:

    

SerializeFilter filter = new Propertyfilter(){@Override
/**
*  arg0是要轉換成json的對象
*  arg1是屬性名稱
*  arg2是屬性值
*  當下面方法返回false,則不轉換該字段,返回true,則轉換該字段;
*/
public boolean apply(Obect arg0,String arg1,Object arg2){if(arg1.equlas("columnFiledname")){return false;}return true; } } String json = JSONObject.toJSONString(javabean,filter);  //使用toJSONString(Object obj,SerializeFilter sf)重載函數

  Jackson簡單使用介紹:

spring mvc 它底層使用的就是jackson

  先導入jsckson的jar包;

  ObjectMapper mapper = new ObjectMapper();String json = mapper.writeValueAsString(javabean);//將一個javabean或者javabean的list集合均可以轉換成json對象;

  當需要對date日期格式進行格式化時可以在上面兩行代碼中加入如下代碼即可:

?  mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd"));//設置一個日期格式化器?

  過濾屬性:

    在不需要的轉化的字段加上注解@JsonIgnore即可;

    亦可以在javabean上面加上注解@JsonIgnoreProperties({"comun1","comun2","comun3"...});

  以上方法有缺陷,當有不同的需求需要生成不同的json數據,那么就需要對javabean中字段進行不同的過濾,這時候就需要使用如下方法(硬編碼):

    在javabean上加入注解@JsonFilter("beanFilter")

  ObjectMapper mapper = new ObjectMapper();FilterProvider fp = new SimpleFilterProvide().addFilter("beanFilter", SimpleBeanPropertyFilter.filterOutAllExcept("comun1","comun2"));//只包含comun1和comun2字段;//FilterProvider fp = new SimpleFilterProvide().addFilter("beanFilter", SimpleBeanPropertyFilter.serializeAllExcept("comun1","comun2"));//不包含comun1和comun2字段; mapper.setFilters(fp);String json = mapper.writeValueAsString(beanList);

struts2框架ajax開發使用response相應數據:

在struts2框架中獲取HttpServletResponse對象,就可以通過response來完成將數據響應到瀏覽器;

瀏覽器端:

  綁定事件,向服務器發送ajax請求(jquery完成)?

服務器端:

  action中可以通過response來直接寫回數據,設置無返回值,或者返回null即可。

  js中eval(String str)函數可以將一個字符串轉換成對象;在使用ajax時,$.post()異步請求函數后面一定要加上"json"參數告訴瀏覽器這是json格式的數據,再者可以使用eval函數將字符串轉為json對象;

struts2框架ajax開發使用json插件來完成操作:

  首先要導入插件包:struts2-json-plugin-版本號.jar

  使用struts2提供的json插件三部曲:

    struts加載配置文件的順序,會先加載插件包之后才會加載我們自己的struts.xml;

    1.將我們自己配置文件中的<package extends = "json-default"/> ;(json-default這個包在struts2-json-plugin.jar包中有)

    2.Action的返回視圖<result name = "success" type = "json">;

    3.因為我們配置了上面兩步,那么struts2框架就會將valueStack中棧頂元素轉換成json響應到瀏覽器,所以說我們只需要將需要響應的數據 存入valueStack棧頂即可;

關于響應的json處理:

  忽略屬性:

    方法1:在需要忽略的屬性的get方法上面添加注解:@JSON(serialize=false)即可;

      上面的方案有弊端,當不同的action需要響應不同的過濾數據時這樣就不通用了;

    方法2:

      在org.apache.struts2.json.JSONResult類中有兩個屬性:

        private List<Pattern> includeProperties;

        private List<Pattern> excludeProperties;

      他們可以設置響應的數據中是否包含或者不包含屬性:

    <result name = "success" type = "json">

       <param name = "excludeProperties">ps\[\d+\].屬性名,ps\[\d+\].屬性名...</param>

      ?<!-- <param name = "includeProperties">ps\[\d+\].屬性名,ps\[\d+\].屬性名...</param> -->

    </result>

    設置root:

      沒有設置root前返回的json結構 ps:[{},{}]

      設置root它的根為ps后的返回的json結構  [{},{}]

    <result name = "success" type = "json">

      <param name = "ps">ps</param>

  ?    <param name = "excludeProperties">\[\d+\].屬性名,ps\[\d+\].屬性名...</param>

      ?<!-- <param name = "includeProperties">\[\d+\].屬性名,ps\[\d+\].屬性名...</param> -->

    </result>

    這樣響應到客戶端就是一個數組那么取值可以使用循環;

Struts2中配置文件struts.xml可以分解各個模塊的xml文件,然后在struts.xml中使用<include>標簽引入即可,方便struts.xml的管理和閱讀。

Struts2.0注解開發:

struts2.0注解時在struts2的2.1版本后引入的,注解的作用就是用來替代原來struts.xml中的一些配置,如<package><action><result>.....等標簽;

使用注解開發首先需要導入struts2-convention-plugin-版本號.jar包;

為何能識別到注解呢?

  因為StrutsParparedAndExecuteFilter過濾器中在加載配置文件的時候會加載struts-plugin.xml插件配置文件,該配置文件中定義了一個名為[struts.convention.package.Locators]的常量,它的值為[action,actions,struts,struts2],也就是說系統會掃描符合的包名進行解析;如果需要更改這種命名規范的話,只需要在struts.xml文件中更改該常量值即可;

對于action可以加如下注解來替代配置文件

?

注解位置注解名稱對應的配置文件釋義
class@Namespace("/")<package namespace="/">?
class@ParentPackage("struts-default")<package extends="struts-default">?
class@Results({@Result(name="",type="",location=""),@Result(name="",type="",location="")......})<global-results><result></global-results>全局result
class   @InterceptorRefs({@InterceptorRef("interceptor-1"),@InterceptorRef("defaultStack")})??
method @Action(value="path",results={@Result(name="",type="",location=""),@Result(name="",type="",location="")......})<action name="path" class="" method=""><result>?
method@Action(value="",interceptorRefs=@InterceptorRef("validation"))?它時用于處理攔截器的
method@Actions(@Action(),@Action(),@Action()......)?可以通過多個路徑來訪問同一個action

使用注解開發完成自定義攔截器對頁面的權限控制

1.創建一個類來實現Interceptor接口或者繼承MethodFilterInterceptor;

2.在struts.xml文件中聲明;

eg:  

  <package name="base" namespace="/" extends="struts-default">
    <interceptors>

      <interceptor name="自定義攔截器name" class = ""></interceptor>

      <interceptor-stack name="myStack">

        <interceptor-ref name = "自定義攔截器name"/>

        <interceptor-ref name = "defaultStack"/>

      </interceptor-stack>

    </interceptors>
  </package>

3.在action的配置中引用(使用注解)

eg:

  @Namespace("/")

  @ParentPackage("base")

  public class ProductAction extends ActionSupport{

    @Action(value="showProduct",interceptorRefs={@InterceptorRef("myStack")})

    public void showProduct(){

      ......

    }

  }

注意@ParentPackage注解中的包名需要同配置文件中定義攔截器的包名相同。(如上兩個紅色標注)。

?

轉載于:https://www.cnblogs.com/laodang/p/9570577.html

總結

以上是生活随笔為你收集整理的Struts2.0第三章(文件上传、ajax开发、json、Fastjson、Jackson、注解开发)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。