存档

2013年8月 的存档

窄屏时google play在chrome下的样式问题

2013年8月23日 没有评论

因前端离职,遗留的下载页面在chrome下窄屏时google play图标的位置问题,接手的人多方努力仍未能得到解决。

今天决定整一下这个问题,到零晨两点多,终于搞出点眉目。

问题原因:
出现问题的图标在窄屏下未定义自己的样式,且窄屏下定义的图片高度有问题。

修正方法:
在窄屏的样式下,修正图片高度,加上特定的两个样式,便可解决问题。

在窄屏窗口下“@media only screen and (max-width:640px) {”的下方样式中,修正:

	.down_btn a {
		width: 120px;
		height: 36px;
		background-size: 100% auto;
		-webkit-background-size: 100% auto
	}

	.down_btn a {
		width: 120px;
		height: 42px;
		background-size: 100% auto;
		-webkit-background-size: 100% auto
	}

然后补充两个样式:

	.down_btn a.google {
		background-position: 0 -46px
	}

	.down_btn a.google:hover {
		background-position: 0 -138px
	}

实际效果有待于周一更新验证。

另外:发现大量无用样式,尚未确认其存在的价值。

分类: 工作 标签: , ,

全屏的背景图等比自适应实现

2013年8月22日 没有评论

碰到个需求,全屏的背景图等比自适应,外行,尝试了一下,搞了个东东,留存备查。

head中加样式:

<style type="text/css">
.s-bg-body .s-bg-div {
	position: absolute;
	top: 0;
	left: 0;
	height: 100%;
	width: 100%;
	z-index: -1;
	background-position: center 0;
	background-repeat: no-repeat;
	background-attachment: fixed;
	background-size: cover;
	-webkit-background-size: cover;
	-o-background-size: cover;
	zoom: 1;
	overflow:hidden;
}
</style>

页面中加相应的样式及背景图,其中body的class跟div的只是名称不同,同名反而不对,原因不详,待高人请教:

<body class="pos s-bg-body">
<div class="s-bg-div" style="background-color:#222;background-image:url(http://xxx.xx/bg.jpg)"></div>
分类: 工作 标签: , ,

Spring容器的获取方式

2013年8月20日 没有评论

偶然看到一个Servlet的Filter实现,在doFilter方法中,发现有对Spring容器的访问,用法如下:

XxxService xxxService = SpringContextHolder.getApplicationContext().getBean("xxxService", XxxService.class);

其中有个SpringContextHolder,看名称就能大概猜出来它的意思,里面保持一个Spring的Context,调用方式上看,是静态的。
实际代码也是这么实现的:

public class SpringContextHolder implements ApplicationContextAware {
    private static ApplicationContext applicationContext; 

    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        SpringContextHolder.applicationContext = applicationContext;
    }

    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }

    public static Object getBean(String name) throws BeansException {
        return applicationContext.getBean(name);
    }
}

整个的调用顺序是这样的:

1、服务启动,初始化SpringContextHolder,Spring的ApplicationContext注入到SpringContextHolder中。
2、有请求需要此Filter处理时,通过SpringContextHolder拿到Spring的容器,从中取出所需的bean。

实际上用Spring还有一种更简单的做法,也是比较中规中矩的,不需要SpringContextHolder,使用原生的WebApplicationContext就可以从doFilter方法的request中取到:

ServletContext serveletContext = request.getSession().getServletContext();
WebApplicationContext springContext = WebApplicationContextUtils.getWebApplicationContext(serveletContext);
XxxService xxxService = springContext.getBean("xxxService", XxxService.class);

以上这种方式使用的前提是在web.xml配置了ContextLoaderListener

	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>

如果没有配置这个ContextLoaderListener,只配置了DispatcherServlet,如下

	<servlet>
		<servlet-name>XXXX</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>classpath:spring/*.xml</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>XXXX</servlet-name>
		<url-pattern>*.do</url-pattern>
	</servlet-mapping>

使用默认的就不成了:WebApplicationContextUtils.getWebApplicationContext(serveletContext);
因为默认从servletContext中取的key是常量:WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE
实际上只使用DispatcherServlet用的key是:FrameworkServlet.SERVLET_CONTEXT_PREFIX + getServletName();即org.springframework.web.servlet.FrameworkServlet.CONTEXT.XXXX
可使用以下方法获取,只是稍麻烦了一点。遍历取相应类型的实例

            ServletContext servletContext = request.getSession().getServletContext();
            WebApplicationContext springContext = null;
            Enumeration<?> names = servletContext.getAttributeNames();
            while (names.hasMoreElements()) {
                String servletName = names.nextElement().toString();
                Object obj = servletContext.getAttribute(servletName);
                if (obj instanceof WebApplicationContext) {
                    springContext = (WebApplicationContext) obj;
                    System.out.println(servletName);
                    break;
                }
            }
            if (webAppContext != null) {
                        XxxService xxxService = springContext.getBean("xxxService", XxxService.class);
            }