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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

java中的action是指什么_Struts2【开发Action】知识要点

發布時間:2025/3/12 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java中的action是指什么_Struts2【开发Action】知识要点 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

前面Struts博文基本把Struts的配置信息講解完了.....本博文主要講解Struts對數據的處理

Action開發的三種方式

在第一次我們寫開發步驟的時候,我們寫的Action是繼承著ActionSupport類的...為啥我們繼承了ActionSupport類呢?下面我就會講解到

繼承ActionSupport類

我們來看一下ActionSupport干了什么:

也就是說,如果我們在Action類中需要用到Struts為我們提供的數據校驗等Struts已經幫我們實現的功能,我們就繼承著ActionSupport類..

實現Action接口

我們再來看看Action接口干了什么:

當然啦,ActionSuppot也繼承著Action接口,所以ActionSuppot擁有Action接口的全部功能....因此,這種開發方式我們是比較少用的...

不繼承任何類、不實現任何接口

開發此類的Action,它是不繼承任何類、不實現任何接口的...也就是說,它就是一個普通的Java類....

Action類

public class PrivilegeAction {

public String login() {

System.out.println("我是普通的javaAction,不繼承任何的類、不實現任何的接口");

return "success";

}

}

在配置文件中配置:

/index.jsp

效果:

小總結

如果我們使用到了Struts2一些特用的功能,我們就需要繼承ActionSupport

如果我們沒用到Struts2的特殊功能,只要平凡寫一個Java類行了。

大多情況下,我們還是會繼承ActionSupport的。

請求數據封裝

一般地,我們使用Servlet的時候都是分為幾個步驟的:

得到web層的數據、封裝數據

調用service層的邏輯業務代碼

將數據保存在域對象中,跳轉到對應的JSP頁面

現在問題來了,我們自己編寫的Action類是沒有request、response、Session、application之類的對象的....我們是怎么得到web層的數據、再將數據存到域對象中的呢??

前面已經說過了,Struts預先幫我們完成了對數據封裝的功能,它是通過params攔截器來實現數據封裝的

register.jsp

首先,我們填寫表單頁面的數據,請求Action處理數據

用戶名:

密碼:

年齡:

生日:

Action封裝基本信息

在Action設置與JSP頁面相同的屬性,并為它們編寫setter方法

private String username;

private String psd;

private int age;

private Date birthday;

public void setUsername(String username) {

this.username = username;

}

public void setPsd(String psd) {

this.psd = psd;

}

public void setAge(int age) {

this.age = age;

}

public void setBirthday(Date birthday) {

this.birthday = birthday;

}

我們直接在業務方法中訪問這些變量,看是否能得到表單的值。

Action封裝對象

一般地,我們注冊的時候,都是在Servlet上把基本信息封裝到對象上...那么在Struts怎么做呢?

創建一個User類,基本的信息和JSP頁面是相同的。

package qwer;

import java.util.Date;

/**

* Created by ozc on 2017/4/27.

*/

public class User {

private String username;

private String psd;

private int age;

private Date birthday;

public String getUsername() {

return username;

}

public void setUsername(String username) {

this.username = username;

}

public String getPsd() {

return psd;

}

public void setPsd(String psd) {

this.psd = psd;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

public Date getBirthday() {

return birthday;

}

public void setBirthday(Date birthday) {

this.birthday = birthday;

}

}

在Action中定義User對象出來,并給出setter和getter方法....值得注意的是:基本信息只要setter就夠了,封裝到對象的話,需要setter和getter

public class ccAction extends ActionSupport {

private User user;

public User getUser() {

return user;

}

public void setUser(User user) {

this.user = user;

}

public String register() {

System.out.println(user.getUsername());

System.out.println(user.getPsd());

System.out.println(user.getAge());

System.out.println(user.getBirthday());

return "success";

}

}

在JSP頁面,提交的name要寫成user.username之類的

用戶名:

密碼:

年齡:

生日:

得到域對象

Struts怎么把數據保存在域對象中呢???Struts提供了三種方式

一、得到Servlet API

我們可以通過ServletActionContext得到Servlet API

由于每個用戶擁有一個Action對象,那么底層為了維護用戶拿到的是當前線程的request等對象,使用ThreadLocal來維護當前線程下的request、response等對象...

//通過ServletActionContext得到Servlet API

javax.servlet.ServletContext context = ServletActionContext.getServletContext();

HttpServletRequest request = ServletActionContext.getRequest();

HttpSession session = request.getSession();

HttpServletResponse response = ServletActionContext.getResponse();

二、ActionContext類

我們還可以通過ActionContext類來得到request、response、session、application被Struts封裝的Map集合

//得到ActionContext 對象

ActionContext context = ActionContext.getContext();

Map session = context.getSession();

Map application = context.getApplication();

//這是request的Map

Map request = context.getContextMap();

三、實現接口

當web容器發現該Action實現了Aware接口,會把相對應的資源通過Aware接口注射進去,實際上就是一種IOC。

Aware實際就是一種攔截器,攔截代碼在執行Action之前執行、將資源注射到Action中

實現SessionAware, RequestAware, ApplicationAware接口,它就要在程序中實現三個方法:

private Map request;

private Map session;

private Map application;

@Override

public void setApplication(Map map) {

this.application = map;

}

@Override

public void setRequest(Map map) {

this.request = map;

}

@Override

public void setSession(Map map) {

this.session = map;

}

通過這些方法,我們就可以得到對應的Map對象.....

小總結

那么,我們有三種方法可以得到Servlet對應的對象,那么該使用哪一種呢???

分析:

第一種方法:需要導入Servlet的包,與Struts耦合了

第二種方法:只能在業務方法中使用ActionContext類得到對應的Map對象,如果有多個方法,那么每個方法都需要寫類似的代碼

第三種方法:可以在類上定義成員變量,以至于整個類都能使用。但是需要實現類、實現對應的方法

如果我們需要使用到對象的其他方法,類似getContextPath()之類的,那么只能使用第一種

如果我們就按照平常的開發,我們就使用第二種【獲取簡單,沒有耦合】

至于第三種,當我們將來可能開發BaseAction的時候,就使用它!

日期轉換問題

前面博文已經講解了,Struts2為我們實現了數據自動封裝...由上篇的例子我們可以看出,表單提交過去的數據全都是String類型的,但是經過Struts自動封裝,就改成是JavaBean對應成員變量的類型了。

但是呢,日期類型只支持是yyyy-MM-dd這種格式的,因為我們在上個例子中直接使用的是Struts支持的格式,因此沒有報錯...本篇博文就是講解Struts如何對日期類型的格式更好地支持

當我們使用的是yyyyMMdd這種格式的時候,我們看看Struts的自動封裝能不能解析出相對應的日期

直接拋出了異常

分析

那么,我們怎么讓Struts能夠支持更多的日期格式呢??比如,我想Struts在自動封裝數據的時候支持yyyyMMdd,yyyy年MM月dd日這樣的日期格式.....

Struts提供了轉換器給我們使用,也就是,我們可以自定義轉換器,我們定義了什么格式,Struts就可以根據對應的格式進行自動封裝...

當我們寫完自定義轉換器,是需要向Struts說明我們寫了,不然的話,Struts是不知道我們自定義了轉換器類的...

也就是說,我們要想實現類型轉換,需要兩步:

編寫自定義轉換器類

告訴Struts我們寫了轉換器類

自定義轉換器類

一般地,我們想要編寫自定義轉換器類,都是實現StrutsTypeConverter類的....

/**

* Created by ozc on 2017/5/1.

* 自定義異常轉換器類

*

* 我們要實現的就是:在Struts轉換的時候,

*

*/

public class MyConvter extends StrutsTypeConverter {

//需求,當Struts自動封裝數據時,也支持yyyyMMdd,yyyy年MM月dd日等格式的支持\

SimpleDateFormat[] format = {new SimpleDateFormat("yyyy-MM-dd"), new SimpleDateFormat("yyyyMMdd"), new SimpleDateFormat("yyyy年MM月dd日")};

/**

* 把String轉換為指定的類型 【String To Date】

*

*

* @param map

* 當前上下文環境

* @param strings

* jsp表單提交的字符串的值

* @param aClass

* 要轉換為的目標類型

*/

@Override

public Object convertFromString(Map map, String[] strings, Class aClass) {

//判斷是否有值

if (strings == null) {

return null;

}

//判斷是否是日期類型的

if (Date.class != aClass) {

return null;

}

//遍歷循環

for (SimpleDateFormat dateFormat : format) {

try {

//解析傳遞進來的第一個就行啦

dateFormat.parse(strings[0]);

} catch (ParseException e) {

//如果格式不對,那么就跳出當前的循環

continue;

}

}

return null;

}

@Override

public String convertToString(Map map, Object o) {

return null;

}

}

告訴Struts,我寫了轉換器類

告訴Struts我寫了一個轉換器類,也分兩種方式

定義了局部轉換器類,就當前包下的Action類有效

定義了全局轉換器類,整個項目有效

全局轉換器

步驟:

在src目錄下創建一個名為xwork-conversion.properties的文件

配置文件的內容:需要轉換的類類型=轉換器類的全名java.util.Date=qwer.MyConvter

局部轉換器類

步驟:

在當前的Action包下創建名為Action名-conversion.properties的文件

文件的內容為:需要轉換的字段【如果是JavaBean里的字段,需要寫上JavaBean的】=轉換器類的全名user.birthday=qwer.MyConvter

效果

錯誤提示頁面

當發生了日期轉換的異常時,Struts給出的頁面是這樣子的:

這個我們稱之為input視圖,我們要做的就是給出用戶更友好的提示,于是在struts.xml文件中配置:如果返回的是input視圖,那么跳轉到我們相對應的頁面上

/error.jsp

文件上傳和下載

在講解開山篇的時候就已經說了,Struts2框架封裝了文件上傳的功能........本博文主要講解怎么使用Struts框架來完成文件上傳和下載

回顧以前的文件上傳

可以使用FileUpload或者SmartUpload組件來完成文件上傳的功能。但是呢,FileUpload組件使用起來是比較麻煩的...而SmartUPload解決中文的問題也非常麻煩

使用Struts進行文件上傳

從要導入的jar包我們就可以知道:Struts內部還是使用fileUpload上傳組件....但是它極大的簡化地我們的具體操作

那我們怎么用它呢??看下面的圖

在Action中使用在表單中定義的name,就可以獲取代表的上傳文件的File對象

在Action中使用在表單中定義的name+FileName,就得到上傳文件的名字

JSP頁面

在注冊頁面上擁有兩個上傳文件控件

Action

得到相對應的File對象、上傳文件名稱、上傳文件的類型

package fileupload;

import java.io.File;

/**

* Created by ozc on 2017/5/2.

*/

public class FileUploadAction {

//上傳文件對應的File對象

private File photo;

private File photo1;

//得到上傳文件的名稱

private String photoFileName;

private String photo1FileName;

//得到上傳文件的類型

private String photoContentType;

private String photo1ContentType;

//給出相對應的setter

public void setPhoto(File photo) {

this.photo = photo;

}

public void setPhoto1(File photo1) {

this.photo1 = photo1;

}

public void setPhotoFileName(String photoFileName) {

this.photoFileName = photoFileName;

}

public void setPhoto1FileName(String photo1FileName) {

this.photo1FileName = photo1FileName;

}

public void setPhotoContentType(String photoContentType) {

this.photoContentType = photoContentType;

}

public void setPhoto1ContentType(String photo1ContentType) {

this.photo1ContentType = photo1ContentType;

}

public String register() {

System.out.println(photo1FileName);

System.out.println(photoFileName);

return "success";

}

}

成功得到數據:

Action業務代碼:

public String register() throws IOException {

//得到上傳的路徑

String path = ServletActionContext.getServletContext().getRealPath("upload");

System.out.println(path);

//創建文件對象

File destFile = new File(path,photoFileName);

//調用工具類方法,將文件拷貝過去

FileUtils.copyFile(photo, destFile);

return "success";

}

效果:

文件下載

我們以前是通過設置request消息頭來實現文件下載的.....那么在Struts又如何實現文件下載呢??

我們請求服務器處理都是通過Action類來完成的,但是呢,Action類的業務方法都是返回字符串。因此,Struts在節點中提供了類型為stream的type值。通過stream來配置相對應的信息,從而實現下載!

列出所有可以下載的文件

Action類的業務方法

public class downLoadAction {

//列出所有可以下載的文件

public String list() {

//得到upload文件夾

String path = ServletActionContext.getServletContext().getRealPath("/upload");

//創建file對象

File file = new File(path);

//列出文件下所有的文件

File[] files = file.listFiles();

//將這些文件存到request域中

HttpServletRequest request = ServletActionContext.getRequest();

request.setAttribute("files", files);

return "list";

}

}

Struts配置文件

/list.jsp

JSP顯示頁面

對不起,沒有下載的頁面

編號文件名稱操作
${file.count}${fn:substringAfter(fileName, "upload\\")}

下載

Action代碼:

/**

* 訪問Action的業務方法僅僅返回的是字符串。因此Struts在result節點提供了stream類型的type,

* 指定了stream就代表著我這是要下載的...

*

* 既然要下載文件,那么肯定需要幾樣東西:

* 1、文件名

* 2、代表文件的流

*/

public String downLoad() {

return "downLoad";

}

//得到要下載的文件名,Struts提供了自動封裝的功能

private String fileName;

//如果文件名是中文的,那么需要手動轉換,因為超鏈接是get方法提交

public void setFileName(String fileName) throws UnsupportedEncodingException {

fileName = new String(fileName.getBytes("ISO8859-1"), "UTF-8");

this.fileName = fileName;

System.out.println(fileName);

}

//得到代表下載文件流,該方法由Struts調用

public InputStream getAttrInputStream() {

return ServletActionContext.getServletContext().getResourceAsStream("/upload/" + fileName);

}

//下載時,顯示的名稱【如果是中文,可能會亂碼,因此要URLencode】---->在Struts.xml文件中通過${}可獲取

public String getDownFileName() throws UnsupportedEncodingException {

fileName = URLEncoder.encode(fileName, "UTF-8");

return fileName;

}

Struts.xml

/list.jsp

application/octet-stream

attrInputStream

attachment;filename=${downFileName}

1024

效果

模型驅動

什么是模型驅動

在Struts2中模型驅動就是用來封裝數據的..完成數據的自動封裝.

為什么要使用模型驅動?

我們之前就使用過Sturts2的數據自動封裝功能,是用params攔截器完成的...既然有了params攔截器,為啥還要模型驅動??

當我們使用params攔截器完成數據自動封裝的時候,如果要封裝的是JavaBean對象,那么在web表單中就必須的name寫上javaBean.屬性名....

這樣的話,web層和Action層就耦合了...因為在web層必須要知道封裝的JavaBean對象是什么才能夠實現自動封裝!

而模型驅動就解決了這個問題!即時不知道Action層的JavaBean對象是什么,也能夠完成數據自動封裝!

模型驅動的實現原理

實現模型驅動功能也是由攔截器完成的,我們來看看攔截器到底做了什么吧....

攔截方法的源碼是這樣的:

public String intercept(ActionInvocation invocation) throws Exception {

//得到當前要執行的Action對象

Object action = invocation.getAction();

//判斷該Action對象是否實現了ModelDriven接口

if(action instanceof ModelDriven) {

ModelDriven modelDriven = (ModelDriven)action;

//獲取值棧對象

ValueStack stack = invocation.getStack();

//得到model的對象

Object model = modelDriven.getModel();

//把對象存到值棧對象中

if(model != null) {

stack.push(model);

}

if(this.refreshModelBeforeResult) {

invocation.addPreResultListener(new ModelDrivenInterceptor.RefreshModelBeforeResult(modelDriven, model));

}

}

return invocation.invoke();

}

把model對象放到值棧對象之后,Parameters 攔截器將把表單字段映射到 ValueStack 棧的棧頂對象的各個屬性中.

也就是說,使用模型驅動是需要配合Params攔截器完成的!

使用數據模型驅動

實現ModelDriven接口

實現ModelDriven接口,重寫方法....實現接口時,要封裝的對象是什么,形參類型就給什么

public class UserAction extends ActionSupport implements ModelDriven {

public String login() {

return SUCCESS;

}

@Override

public User getModel() {

return null;

}

}

對象實例化

public class UserAction extends ActionSupport implements ModelDriven {

//這里一定要實例化

User user = new User();

public User getUser() {

return user;

}

public void setUser(User user) {

this.user = user;

}

@Override

public User getModel() {

return user;

}

}

測試

JSP提交頁面,直接寫上JavaBean對象的屬性就行了..不需要寫上JavaBean對象的名稱!

用戶名:
密碼:
電話:
郵箱:

在Action業務方法中輸出User對象的數據

@Override

public String execute() throws Exception {

System.out.println(user);

return SUCCESS;

}

如果文章有錯的地方歡迎指正,大家互相交流。習慣在微信看技術文章,想要獲取更多的Java資源的同學,可以關注微信公眾號:Java3y

總結

以上是生活随笔為你收集整理的java中的action是指什么_Struts2【开发Action】知识要点的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 少妇天堂网 | 怒海潜沙秦岭神树 | 激情文学亚洲色图 | 久久久久无码精品国产sm果冻 | 光明影院手机版在线观看免费 | 亚洲国产经典 | 国产免费一区二区三区视频 | 亚洲熟女乱色综合亚洲av | 亚洲深爱 | 国产精品无码一区二区三区免费 | 亚洲视频免费播放 | 青青操久久 | 自拍偷拍导航 | 最新黄色网址在线观看 | 日韩最新中文字幕 | wwwxxx日本| 一区二区在线免费视频 | 亚洲一区二区不卡在线观看 | av在线中文 | 四虎激情 | 亚洲五月花| 中文字幕成人一区 | 国产日产久久高清欧美一区 | 日韩欧美无 | 又黄又骚又爽 | 很污的网站 | 公侵犯人妻中文字慕一区二区 | 日本大乳奶做爰 | 美女网站免费观看 | 精品少妇久久久 | 国产91精品一区二区 | 91视频免费 | 69亚洲精品 | 久久97人妻无码一区二区三区 | 青青操精品 | 高潮毛片7777777毛片 | 91精品一区二区三区在线观看 | 迈开腿让我尝尝你的小草莓 | 久久久久人妻精品一区二区三区 | 久久婷色 | 久热国产精品 | 精品国产高清在线观看 | 久草加勒比 | 天天爱天天操 | 色涩av | 黑帮大佬和我的365日第二部 | av在线资源观看 | 女生脱裤子让男生捅 | 日韩国产在线观看 | 日日夜夜网 | 色眯眯影视| 亚洲欧美在线视频免费 | 三级小说视频 | 亚洲a精品| 中国毛片基地 | 亚洲国产精品成人综合 | 97视频在线看 | 绝顶高潮videos合集 | 欧美网站在线 | 欧美透逼视频 | 亚洲艹| 色婷婷av久久久久久久 | 色插综合 | 最近日韩中文字幕中文 | 黄色网页在线看 | 久久色在线视频 | 国模一区二区三区 | 在线激情网 | 亚洲AV无码国产精品 | 国产情侣久久久久aⅴ免费 caoporn成人 | 91av高清 | 日本护士体内she精2xxx | 欢乐谷在线观看免费播放高清 | 九九热精品视频在线 | 丰满人妻一区二区三区四区53 | 中文字幕日韩一级 | 中文字幕 成人 | 日韩精品在线视频免费观看 | 青娱乐极品在线 | 日韩综合第一页 | 日韩一区二区三区四区五区 | 久精品视频 | 77久久 | 日本三级视频在线观看 | 老女人网站| 成人亚洲天堂 | 一区视频 | 黄色一级一级 | 永久免费在线观看视频 | 欧美一区二区三区爱爱 | 国产一区综合 | 午夜试看120秒 | 9191在线视频 | 91精品国产高清91久久久久久 | 在线观看国产成人 | 伊伊成人网 | 亚洲激情在线观看 | 国产激情av一区二区三区 | 壮汉被书生c到合不拢腿 |