JAVA_WEB專案之Action層利用ModelDriven抽取BaseAction
在做web專案的過程中,我們會遇到Action層隨時的從前臺獲取資料交給業務層處理,但是如果有多個Action類,我們會發現一些共同點,如獲取資料儲存到request,session等儲存域裡面,當然我們一般在Struts中都是通過ActionContext獲取的,我們都知道ActionContext沒有侵入性,下面介紹抽取出BaseAction,讓所有Action類繼承這個類,同時我們也可以不用ActionContext存資料,我們實現RequestWare,SessionWare等介面,通過map集合儲存,可以減少我們每次在每個Action類中都通過ActionContext存資料,如果有多個我們就要寫多次ActionContext獲取request,session等相關物件儲存,完全可以不這麼做,因而我們可以使用下面的方法減少程式碼的編寫。
BaseAction:
package com.shop.action;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.Map;
import javax.annotation.Resource;
import org.apache.struts2.interceptor.ApplicationAware;
import org.apache.struts2.interceptor.RequestAware;
import org.apache.struts2.interceptor.SessionAware;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import com.shop.service.AccountService;
import com.shop.service.CategoryService;
@Controller(value="baseAction")
@Scope(value="prototype")
public class BaseAction<T> extends ActionSupport implements RequestAware,SessionAware,ApplicationAware,ModelDriven<T>{
@Resource(name="categoryService")//可以看做是xml中的bean的ref,依賴於Service層中的categoryService
protected CategoryService categoryService=null;
@Resource
protected AccountService accountService=null;
protected T model;
public T getModel() {
System.out.println("---model----"+model);
return model;
}
public BaseAction(){
System.out.println(this.getClass().getGenericSuperclass());
Type type= this.getClass().getGenericSuperclass();
ParameterizedType parameterizedType=(ParameterizedType) type;
Class clazz= (Class) parameterizedType.getActualTypeArguments()[0];
try {
model=(T) clazz.newInstance();
} catch (Exception e) {
// TODO Auto-generated catch block
//e.printStackTrace();
throw new RuntimeException(e);
}
}
protected Map<String, Object> request;
protected Map<String, Object> session;
protected Map<String, Object> application;
public void setApplication(Map<String, Object> application) {
// TODO Auto-generated method stub
this.application=application;
}
public void setSession(Map<String, Object> session) {
// TODO Auto-generated method stub
this.session=session;
}
public void setRequest(Map<String, Object> request) {
// TODO Auto-generated method stub
this.request=request;
}
}
讓CategoryAction繼承BaseAction:
package com.shop.action;
import java.util.Map;
import javax.annotation.Resource;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.interceptor.ApplicationAware;
import org.apache.struts2.interceptor.RequestAware;
import org.apache.struts2.interceptor.SessionAware;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.shop.pojo.Category;
import com.shop.service.CategoryService;
@Controller(value="categoryAction")
@Scope(value="prototype")
public class CategoryAction extends BaseAction<Category>{
public CategoryAction(){
super();
System.out.println("--CategoryAction---");
}
/**
* 資料在前臺如何顯示的集中方法
* @return
*/
public String save() {
// TODO Auto-generated method stub
System.out.println("save方法:"+model.getType()+","+model.getHot());
//categoryService.save(category);
//第一種Action依賴於Http內建的物件,不推薦使用
// ServletActionContext.getRequest().setAttribute("req",model.getType() );
// ServletActionContext.getRequest().getSession().setAttribute("ses",model.getType() );
// ServletActionContext.getServletContext().setAttribute("ses",model.getType() );
//第二種:沒有侵入性,但是程式碼多,比較繁瑣
// ActionContext.getContext().put("res", model.getType() );
// ActionContext.getContext().getSession().put("ses", model.getType() );
// ActionContext.getContext().getApplication().put("app", model.getType());
//第三種方法
request.put("req", model.getType());
session.put("ses", model.getType());
application.put("app", model.getType() );
return "index";
}
public String query(){
request.put("list", categoryService.query());
return "index";
}
}
相關文章
- JAVA_WEB專案之Lucene檢索框架入門案例JavaWeb框架
- JAVA_WEB專案之j使用query的驗證框架的例子JavaWeb框架
- 使用Github Action來輔助專案管理Github專案管理
- Jenkins in Action :GitLab 部署 Maven 專案JenkinsGitlabMaven
- JAVA中Action層, Service層 ,model層 和 Dao層的功能區分Java
- Springboot專案Github Action生成Docker映象Spring BootGithubDocker
- 通過GitHub Action自動部署Maven專案GithubMaven
- 【SSH網上商城專案實戰02】基本增刪查改、Service和Action的抽取以及使用註解替換xml...XML
- 白嫖GitHub Action實現開源專案CICDGithub
- 利用 GitHub Action 自動釋出 DockerGithubDocker
- SSH框架之Action框架
- 利用 systemd 部署 golang 專案Golang
- Spring Boot專案利用MyBatis Generator進行資料層程式碼自動生成Spring BootMyBatis
- 討論專案合理分層
- 利用Github Action實現Tornadofx/JavaFx打包GithubJava
- Java Web之BaseServlet的抽取JavaWebServlet
- 利用Git subtree 部署專案到 GitHubGithub
- java_web:EL表示式的使用JavaWeb
- 如何利用專案管理軟體制定專案進度計劃?專案管理
- 實際專案中的 MVVM(積木)模式第二章:model –如何高效利用資料層MVVM模式
- 你的專案應該如何分層?
- express中間層搭建前端專案3Express前端
- AKM專案軼事之新新專案
- 專案總結之專案失誤
- 專案經理之專案跟蹤
- 對專案版本自動控制——利用gitversionGit
- 利用nginx 配置vue多專案環境NginxVue
- 開源專案如何利用社交媒體
- 利用 ant 指令碼修改專案包名指令碼
- vuex 原始碼:深入 vuex 之 actionVue原始碼
- 專案(Explore)總結之專案概述
- Golang 專案之配置檔案Golang
- 關於專案中 Repository 層的思考
- 《專案管理之美》專案管理
- 專案管理之文件專案管理
- Linux企業級專案實踐之網路爬蟲(14)——使用正規表示式抽取HTML正文和URLLinux爬蟲HTML
- APK加固之類抽取分析與修復APK
- 利用 Webpack 實現小程式多專案管理Web專案管理