Struts 2 攔截器中得到bean以及讀取WEB-INF下的spring的xml檔案
Struts 2 攔截器中得到bean以及讀取WEB-INF下的spring的xml檔案
1.直接得到bean
public class OperaLogInterceptor extends AbstractInterceptor {
private static final long serialVersionUID = 1L;
@SuppressWarnings("unchecked")
protected Set excludeMethods;
@SuppressWarnings("unchecked")
protected Set includeMethods;
/**
* 攔截器方法
*/
@SuppressWarnings({ "unchecked", "static-access" })
public String intercept(ActionInvocation invocation) {
String result = null;
HttpServletRequest request = ServletActionContext.getRequest();
BaseAction action = (BaseAction) invocation.getAction();
ServletContext sc = ServletActionContext.getServletContext();
//ApplicationContext ctx = WebApplicationContextUtils.getRequiredWebApplicationContext(sc);
ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(sc);
ModuleService moduleService = (ModuleService) ctx.getBean("moduleService");//模組service
OperationLogService logService = (OperationLogService) ctx.getBean("operationService");//模組service
try {
result = invocation.invoke();
// 判斷是否需要寫日誌
if (applyMethod(excludeMethods, includeMethods, invocation.getProxy().getMethod())) {
this.saveLog(getModulename(request, moduleService),AlphaUtil.getIP(request), request.getRemoteHost(),action.getEmployee().getEId(), action.getEmployee().getEName(), logService);
}
} catch (Exception e) {
e.printStackTrace();
return action.SUCCESS;
}
return result;
}
/**
* 返回模組的url
*
* @param request
* @param action
* @return
*/
@SuppressWarnings("unchecked")
private String getModulename(HttpServletRequest request, ModuleService moduleService) {
//String modulename = request.getRequestURI() + StringUtil.getparamString(request.getParameterMap());
String modulename = "";
String url = request.getRequestURI();
if (url.length() > 20) {
url = url.substring(17);
}
List mList = moduleService.query("from Tbmodule where MUrl='"+url+"'");
if (null != mList && mList.size()>0) {
Tbmodule module = (Tbmodule) mList.get(0);
modulename = module.getMName();
}
System.out.println("modulename="+modulename);
return modulename;
}
/**
* 返回是否需要寫操作日誌
*
* @param excludeMethods
* @param includeMethods
* @param method
* @return
*/
private boolean applyMethod(Set<String> excludeMethods,
Set<String> includeMethods, String method) {
if (includeMethods != null) {
for (String s : includeMethods) {
boolean bl = Pattern.compile(s).matcher(method).matches();
if (bl)
return true;
}
}
if (excludeMethods != null) {
for (String s : excludeMethods) {
boolean bl = Pattern.compile(s).matcher(method).matches();
if (bl)
return false;
}
}
return true;
}
/**
* 寫操作日誌
* @param olBusinussName:業務名稱
* @param olOperationIp:操作人IP
* @param olOperationTable:操作表名
* @param olOperationUserId:操作人編號
* @param olOperationUserName:操作人名稱
* @param logService
*/
private void saveLog(String olBusinussName,
String olOperationIp, String olOperationTable, Integer olOperationUserId,
String olOperationUserName, OperationLogService logService) {
try {
Tboperationlog oplog = new Tboperationlog();
oplog.setOlOperationDate(new Date());
oplog.setOlBusinussName(olBusinussName);
oplog.setOlOperationIp(olOperationIp);
oplog.setOlOperationTable(olOperationTable);
oplog.setOlOperationUserId(olOperationUserId);
oplog.setOlOperationUserName(olOperationUserName);
logService.save(oplog);
} catch (Exception e) {
e.printStackTrace();
}
}
public void setExcludeMethods(String excludeMethods) {
this.excludeMethods = TextParseUtil
.commaDelimitedStringToSet(excludeMethods);
}
public Set getExcludeMethodsSet() {
return excludeMethods;
}
public void setIncludeMethods(String includeMethods) {
this.includeMethods = TextParseUtil
.commaDelimitedStringToSet(includeMethods);
}
public Set getIncludeMethodsSet() {
return includeMethods;
}
public static void main(String a[]) {
boolean bl = Pattern.compile("").matcher("").matches();
// 當條件滿足時,將返回true,否則返回false
System.out.println(bl);
}
}
2.各種讀取xml的方法整理:
讀取xml檔案
/**
* 利用XmlBeanFactory(Resource resource)
* 這裡Resource必須是xml格式
* Resource包括:AbstractResource, ClassPathResource, FileSystemResource,
* InputStreamResource, ServletContextResource, UrlResource
*/
/*
* 利用 InputStreamResource(InputStream inputStream)
* 要將applicationContext.xml放在專案根目錄下
*/
InputStream is = null;
try {
is = new FileInputStream("applicationContext.xml");
} catch (FileNotFoundException e) {
e.printStackTrace();
}
Resource resource = new InputStreamResource(is);
BeanFactory factory = new XmlBeanFactory(resource);
UserDao userDao = (UserDao)factory.getBean("userDao");
/*
* 利用 Properties
* 要將bean.properties放在類路徑--原始檔夾(src)目錄下
*/
具體見http://blog.csdn.net/lwzcjd/archive/2008/10/21/3116298.aspx
1.利用ClassPathXmlApplicationContext
可以從classpath中讀取XML檔案
(1) ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao userDao = (UserDao)context.getBean("userDao");
(2) ClassPathXmlApplicationContext resource = new ClassPathXmlApplicationContext(new String[]{"applicationContext-ibatis-oracle.xml","applicationContext.xml","applicationContext-data-oracle.xml"});
BeanFactory factory = resource;
UserDao userDao = (UserDao) factory.getBean("userDao");
2. 利用ClassPathResource
可以從classpath中讀取XML檔案
Resource cr = new ClassPathResource("applicationContext.xml");
BeanFactory bf=new XmlBeanFactory(cr);
UserDao userDao = (UserDao)bf.getBean("userDao");
載入一個xml檔案 org.springframework.beans.factory.config.PropertyPlaceholderConfigurer不起作用
3.利用XmlWebApplicationContext讀取
從Web應用程式的檔案架構中,指定相對位置來讀取定義檔案。
XmlWebApplicationContext 的建構子無法帶引數,參考API檔案會發現,預設的location會指向/WEB-INF/applicationContext.xml檔案。使用其 public static屬性DEFAULT_CONFIG_LOCATION可取得此預設檔名。由於我使用MyEclipse,預設會多一個"/WebRoot"的 目錄在WEB-INF之前,因此若在web project裡有一些與web無關的程式要使用context時(例如處理一些MVC架構中的"M"的部份),就無法使用 XmlWebApplicationContext來讀取bean定義檔,因為default location會差一個"WebRoot"的目錄。
即 使在web.xml裡面,在DispatcherServlet定義中重新定義contextConfigLocation也一樣(此定義可以 override掉XmlWebApplicationContext中的DEFAULT_CONFIG_LOCATION值),因為與web無關的程式 並不會經過web.xml的定義檔設定。目前我還沒試成功過XmlWebApplicationContext取得bean定義檔,使用 ClassPathXmlApplicationContext反而會快一些。
XmlWebApplicationContext ctx = new XmlWebApplicationContext();
ctx.setConfigLocations(new String[] {"/WEB-INF/ applicationContext.xml");
ctx.setServletContext(pageContext.getServletContext());
ctx.refresh();
UserDao userDao = (UserDao ) ctx.getBean("userDao ");
4.利用FileSystemResource讀取 Resource rs = new FileSystemResource("D:/tomcat/webapps/test/WEB-INF/classes/ applicationContext.xml"); BeanFactory factory = new XmlBeanFactory(rs); UserDao userDao = (UserDao )factory.getBean("userDao"); 值得注意的是:利用FileSystemResource,則配置檔案必須放在project直接目錄下,或者寫明絕對路徑,否則就會丟擲找不到檔案的異常 5.利用FileSystemXmlApplicationContext讀取 可以指定XML定義檔案的相對路徑或者絕對路徑來讀取定義檔案。 方法一: String[] path={"WebRoot/WEB-INF/applicationContext.xml","WebRoot/WEB-INF/applicationContext_task.xml"}; ApplicationContext context = new FileSystemXmlApplicationContext(path); 方法二: String path="WebRoot/WEB-INF/applicationContext*.xml"; ApplicationContext context = new FileSystemXmlApplicationContext(path); 方法三: ApplicationContext ctx = new FileSystemXmlApplicationContext("classpath:地址"); 沒有classpath的話就是從當前的工作目錄 ******************************************************************************* ** 分割一下 ** ******************************************************************************* 獲取Spring框架管理的類例項的方法有多種,如下: 方法一:在初始化時儲存ApplicationContext物件 程式碼: ApplicationContext ac = new FileSystemXmlApplicationContext("applicationContext.xml"); ac.getBean("beanId"); 說明: 這種方式適用於採用Spring框架的獨立應用程式,需要程式通過配置檔案手工初始化Spring的情況。 方法二:通過Spring提供的工具類獲取ApplicationContext物件 程式碼: import org.springframework.web.context.support.WebApplicationContextUtils; ApplicationContext ac1 = WebApplicationContextUtils.getRequiredWebApplicationContext(ServletContext sc) ApplicationContext ac2 = WebApplicationContextUtils.getWebApplicationContext(ServletContext sc) ac1.getBean("beanId"); ac2.getBean("beanId"); 說明: 這種方式適合於採用Spring框架的B/S系統,通過ServletContext物件獲取ApplicationContext物件,然後 在通過它獲取需要的類例項。 上面兩個工具方式的區別是,前者在獲取失敗時丟擲異常,後者返回null。 方法三:繼承自抽象類ApplicationObjectSupport 說明: 抽象類ApplicationObjectSupport提供getApplicationContext()方法,可以方便的獲取到 ApplicationCont ext。Spring初始化時,會通過該抽象類的setApplicationContext(ApplicationContext context)方法將ApplicationContext 物件注入。 方法四:繼承自抽象類WebApplicationObjectSupport 說明: 類似上面方法,呼叫getWebApplicationContext()獲取WebApplicationContext 方法五:實現介面ApplicationContextAware 說明: 實現該介面的setApplicationContext(ApplicationContext context)方法,並儲存ApplicationContext 對 象。Spring初始化時,會通過該方法將ApplicationContext 物件注入。 以上方法適合不同的情況,請根據具體情況選用相應的方法。 這裡值得提一點的是,系統中用到上述方法的類實際上就於Spring框架緊密耦合在一起了,因為這些類是知 道它們是執行在Spring框架上的,因此,系統中,應該儘量的減少這類應用,使系統儘可能的獨立於當前運 行環境,儘量通過DI的方式獲取需要的服務提供者。 本人認為,方法五比較可行,可以設計一個工具類,專門來獲取Spring中的類。減少對業務程式碼的侵入性。相關文章
- Struts2 ---攔截器的理解
- struts的常用配置以及自定義攔截器
- Spring AOP 在 XML檔案中實現 AspectJ 攔截SpringXML
- Struts2中攔截器的簡單實現
- Struts2自定義攔截器
- struts struts攔截器(過濾器)過濾器
- Spring MVC 中的攔截器的使用“攔截器基本配置” 和 “攔截器高階配置”SpringMVC
- Struts2教程8:攔截器概述
- Struts2攔截器實現原理
- Spring Boot中攔截器的使用Spring Boot
- Struts配置檔案詳解,web.xml以及struts-cofig.xml,以及struts-cofig.xml中各個標籤的作用。(轉)WebXML
- spring mvc攔截器,spring攔截器以及AOP切面的區別和原始碼SpringMVC原始碼
- spring中的過濾器與攔截器Spring過濾器
- 簡單讀取XML檔案中的值XML
- struts2的struts.xml檔案的元素結構XML
- struts2的execAndWait攔截器使用AI
- Java Struts 實現攔截器Java
- 【Struts2】:攔截器實現方法過濾
- Spring裡面xml檔案中bean的依賴和繼承SpringXMLBean繼承
- struts2中struts.xml和web.xml檔案解析及工作原理XMLWeb
- spring攔截器Spring
- Mybatis中的攔截器MyBatis
- Spring Boot專案中如何定製攔截器Spring Boot
- XMl 檔案屬性的讀取XML
- spring mvc 攔截器的使用SpringMVC
- Rss-Rome 閱讀器讀取XML檔案XML
- SQL Server中讀取XML檔案的簡單做法SQLServerXML
- SpringBoot攔截器中獲取註解、攔截器中注入ServiceSpring Boot
- JAVA 讀取xml檔案JavaXML
- Struts2 原始碼分析-----攔截器原始碼解析 --- ParametersInterceptor原始碼
- spring boot 攔截器Spring Boot
- grpc中的攔截器RPC
- SpringMVC中的攔截器SpringMVC
- 文摘:在EJB中讀取XML配置檔案XML
- 讀取xml檔案 解析雙層xmlXML
- Java系列:讀取XML檔案JavaXML
- C#讀取Xml檔案C#XML
- 用JDOM讀取XML檔案XML