Struts 2 攔截器中得到bean以及讀取WEB-INF下的spring的xml檔案

JavaAlpha發表於2013-07-26

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中的類。減少對業務程式碼的侵入性。

相關文章