java Web 启动时自动执行代码的几种方式
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java Web 启动时自动执行代码的几种方式相关的知识,希望对你有一定的参考价值。
Web容器启动后执行代码的几种方式其执行顺序为:
4===>5===>1===>2===>3
即指定init-method的Bean开始执行
接着实现spring的Bean后置处理器开始执行
然后是Servlet的监听器执行
再接下来是Servlet的过滤器执行
最后才是Servlet执行
1、实现Servlet监听器接口ServletContextListener
[java] view plain copy
public class InitListener implements ServletContextListener
@Override
public void contextDestroyed(ServletContextEvent context)
@Override
public void contextInitialized(ServletContextEvent context)
// 上下文初始化执行
System.out.println("================>[ServletContextListener]自动加载启动开始.");
SpringUtil.getInstance().setContext(
<span style="white-space:pre"> </span>WebApplicationContextUtils.getWebApplicationContext(arg0.getServletContext())
<span style="white-space:pre"> </span>);
然后在web.xml文件配置该监听器
[html] view plain copy
<listener>
<listener-class>com.test.init.InitListener</listener-class>
</listener>
2、实现Servlet的过滤器Filter
[html] view plain copy
public class InitFilter implements Filter
@Override
public void destroy()
@Override
public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2) throws IOException,
ServletException
@Override
public void init(FilterConfig config) throws ServletException
System.out.println("================>[Filter]自动加载启动开始.");
// 读取Spring容器中的Bean[此时Bean已加载,可以使用]
//写启动需要执行的代码
System.out.println("================>[Filter]自动加载启动结束.");
然后在web.xml文件配置过滤器即可
[html] view plain copy
<filter>
<filter-name>InitFilter</filter-name>
<filter-class>com.test.init.InitFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>InitFilter</filter-name>
<url-pattern>/</url-pattern>
</filter-mapping>
3、编写一个Servlet,在web.xml里面配置容器启动后执行即可
[html] view plain copy
public class InitServlet extends HttpServlet
/**
*/
private static final long serialVersionUID = 1L;
@Override
public void init(ServletConfig config)
try
super.init();
catch (ServletException e)
e.printStackTrace();
System.out.println("================>[Servlet]自动加载启动开始.");
// 读取Spring容器中的Bean[此时Bean已加载,可以使用]
//执行想要的代码
System.out.println("================>[Servlet]自动加载启动结束.");
然后在web.xml文件配置该Servlet的启动方式为:容器启动后执行
<servlet>
<servlet-name>InitServlet</servlet-name>
<servlet-class>com.test.init.InitServlet</servlet-class>
<init-param>
<param-name>username</param-name>
<param-value>test</param-value>
</init-param>
<!-- 此处指定加载顺序为2,表明还有优先级更高的Servlet要先执行 -->
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>InitServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
关于启动后执行,由load-on-startup指定:
(1)当值为0或者大于0时,表示容器在应用启动时就加载这个servlet。值越小,启动优先级越高;
(2)当是一个负数时或者没有指定时,表示该servlet被调用时才加载。
4、如果你使用Spring IOC作为Bean管理容器,那么可以指定init-method其中init-method表示bean加载成功后,立即执行某个方法。配置如下:start为要执行的方法名称
[html] view plain copy
<!-- service -->
<bean id="shopService" class="com.test.teach.service.ShopService" <span style="color:#33ffff;">init-method="start"</span>>
<property name="shopDao" ref="shopDao" />
</bean> 参考技术A 1 监听器, 监听servletContext,这也是spring的启动方式
2 servlet配置<load-on-startup>0</load-on-startup> 表示在web启动时直接实例化,那么我们就可以在init()中写想要运行的代码
3 依赖于spring的定时任务,配置每秒运行,近似的等于启动时运行
4 各种加载方法,初始化方法,写在必然会加载class的地方:
(1)static 静态代码块,会在class文件加载时运行,写在controller层或servece层或某个 @Component
(2)构造方法,写在controller层
(3)@PostConstruct 类似构造方法,sping用这个注解来处理注入前初始化参数
(4)servlet的配置注解@WebServlet spring的配置注解@Configuration
等等
Windows从web下载文件的几种方式
最近搞app自动化测试,需要自动从网页上下载apk用于测试,顺便学习了几种从web下载文件的方式。
一、PowerShell DownloadFile 命令
PowerShell 是一种winodws原生的脚本语言,使用很方便,可以实现很多复杂的功能。
首先启动PowerShell,可以在cmd里执行 start powershell,也可以按住shift建右击选择打开powershell
启动powershell后输入如下命令:
$client = new-object System.Net.WebClient $client.DownloadFile(\'url\', \'file\')
这里的url是下载文件的地址,file是文件保存路径(包括文件名)。如果出现报错如下:使用“2”个参数调用“DownloadFile”时发生异常:“在 WebClient 请求期间发生异常。”
就是文件保存路径没有写完整,一定要包括文件名。如:D:\\app-release.apk
在Jenkins build step 中执行 PowerShell 命令
当然这是手动在powershell命令行执行的,并没有实现自动化。我们需要把它放到Jenkins中去实现。
在Jenkins中执行powershell命令需要先安装相应插件如下:
安装完重启,就可以在任务构建中添加执行powershell命令的操作:
填入上面的两条命令,就可以执行文件下载操作了。
多个build step
如果有多个step呢?如果想要在下载文件失败后进行其他操作呢?
上面的操作,无论怎么执行 PowerShell 命令,build step 的结束状态都是 "成功"(包括一些命令执行失败的情况)。这是因为PowerShell 执行的过程中没有执行 exit 调用,Jenkins 无法判断执行的命令是否成功退出,所以就默认是成功的了。实际上,当命令执行失败或是满足一些条件时,我们希望 build step 的结束状态是 "失败",后续的 build step 根据前面 step 的结束状态决定是否执行。
这就需要在PowerShell 命令执行后执行 exit 调用:判断脚本执行成功时调用 exit 0;判断脚本执行失败时调用 exit 1
也就是执行三条命令,例如:
$client = new-object System.Net.WebClient $client.DownloadFile(\'url\', \'file\') exit 1
二、python实现文件下载
利用python+selenium也可以实现从web上下载文件,首先要确保对应调用的浏览器安装好driver,参考:https://www.cnblogs.com/Dahlia/p/10655573.html
chrome下载
对于Chrome浏览器,设置其options:
- download.default_directory:设置下载路径
- profile.default_content_settings.popups:设置为 0 禁止弹出窗口
代码示例:
# -*- coding: utf-8 -*- from selenium import webdriver from time import sleep options = webdriver.ChromeOptions() prefs = {\'profile.default_content_settings.popups\': 0, \'download.default_directory\': \'d:\\\\\'} options.add_experimental_option(\'prefs\', prefs) driver = webdriver.Chrome(executable_path=\'D:\\\\chromedriver.exe\', chrome_options=options) driver.get(\'http://sahitest.com/demo/saveAs.htm\') driver.find_element_by_xpath(\'//a[text()="testsaveas.zip"]\').click() sleep(3) driver.quit()
firefox下载
同样,对于Firefox,需要我们设置其Profile:
- browser.download.dir:指定下载路径
- browser.download.folderList:设置成2,表示使用自定义下载路径;设置成0,表示下载到桌面;设置成1,表示下载到默认路径
- browser.download.manager.showWhenStarting:在开始下载时是否显示下载管理器
- browser.helperApps.neverAsk.saveToDisk:对所给出文件类型不再弹出框进行询问
代码示例:
# -*- coding: utf-8 -*- from selenium import webdriver from time import sleep profile = webdriver.FirefoxProfile() profile.set_preference(\'browser.download.dir\', \'d:\\\\\') profile.set_preference(\'browser.download.folderList\', 2) profile.set_preference(\'browser.download.manager.showWhenStarting\', False) profile.set_preference(\'browser.helperApps.neverAsk.saveToDisk\', \'application/zip\') driver = webdriver.Firefox(firefox_profile=profile) driver.get(\'http://sahitest.com/demo/saveAs.htm\') driver.find_element_by_xpath(\'//a[text()="testsaveas.zip"]\').click() sleep(3) driver.quit()
firefox下载有个要注意的地方:
browser.helperApps.neverAsk.saveToDisk这个参数是对所给出文件类型不再弹出框进行询问,需要明确一下对应文件的MIME类型,参考:http://www.w3school.com.cn/media/media_mimeref.asp
在实践的时候下载的是apk文件,发现这里没列出apk的MIME类型。查阅其他资料发现,apk对应:application/vnd.android.package-archive。
以上两个方法稍微优化一下:
# -*- coding: utf-8 -*- from selenium import webdriver from time import sleep import os class WebDownload: chromedriver_path = \'E:\\\\chromedriver\\\\chromedriver.exe\' down_dir = \'E:\\\\RED\\\\workspace\\\\appAuto\\\\apk\\\\Android10\' file_name = \'app.apk\' url = \'https://www.xxx\' def chrome_download(self): list = os.listdir(self.down_dir) #列出目录的下所有文件和文件夹 if self.file_name in list: os.remove(os.path.join(self.down_dir,self.file_name)) # download.default_directory:设置下载路径 # profile.default_content_settings.popups:设置为 0 禁止弹出窗口 options = webdriver.ChromeOptions() prefs = {\'profile.default_content_settings.popups\': 0, \'download.default_directory\': self.down_dir} options.add_experimental_option(\'prefs\', prefs) driver = webdriver.Chrome(executable_path=self.chromedriver_path, chrome_options=options) driver.get(url=self.url) driver.find_element_by_id(\'down_load\').click() sleep(20) driver.quit() def firefox_download(self): list = os.listdir(self.down_dir) # 列出目录的下所有文件和文件夹 if self.file_name in list: os.remove(os.path.join(self.down_dir, self.file_name)) # browser.download.dir:指定下载路径 # browser.download.folderList:设置成2,表示使用自定义下载路径;设置成0,表示下载到桌面;设置成1,表示下载到默认路径 # browser.download.manager.showWhenStarting:在开始下载时是否显示下载管理器 # browser.helperApps.neverAsk.saveToDisk:对所给出文件类型不再弹出框进行询问。apk:application/vnd.android.package-archive profile = webdriver.FirefoxProfile() profile.set_preference(\'browser.download.dir\', self.down_dir) profile.set_preference(\'browser.download.folderList\', 2) profile.set_preference(\'browser.download.manager.showWhenStarting\', False) profile.set_preference(\'browser.helperApps.neverAsk.saveToDisk\', \'application/vnd.android.package-archive\') driver = webdriver.Firefox(firefox_profile=profile) driver.get(self.url) driver.find_element_by_id(\'down_load\').click() sleep(20) driver.quit() if __name__ == \'__main__\': # WebDownload().chrome_download() WebDownload().firefox_download()
以上是关于java Web 启动时自动执行代码的几种方式的主要内容,如果未能解决你的问题,请参考以下文章