发表于: 2017-07-06 15:46:41
1 1065
今天完成的:
Task4完成
收获:
1.时间戳和字面时间的互转只是简单的计算,所消耗的资源远远达不到引发问题的地步。
使用时间戳的唯一考虑是:应用是否涉及多时区,时间数据是否和时区相关。如果回答“是”,那么就必须使用时间戳,没有任何第二方案。
只有时间戳表示的时间是准确、恒定的,就连时间+日期+时区也不行——时区这玩意儿可不是恒定不变的……
其余的都不是什么重要的考虑,自己喜欢就行。
一般认为坚持使用时间戳总是好的,在程序设计中只会提供便利,不会引入坏处。至于查看数据时暴露时间戳原值,那是显示环节的不完备(或故意设计)
日期的字符串-时间互转、计算、比较及时区转换,请使用后台语言中提供的相关类,不自己造轮子就可以。
可以略微注意2038年问题的陷阱。对于MySQL而言,如果存时间戳请使用timestamp或bigint,而不要使用int。
以前一直使用timestamp+触发器来保存时间的,后来改成bigint,使用unix_timestamp()将date转为时间戳,再存入bigint即可。
但在使用bigint存储时间戳类型的数据时,有一个很奇怪的bug,只能存入年,月日等详细信息则无法显示,只好找师兄手动写了时间。
2.注意el表达式取带有特殊字符的属性时,要以${Developer["create_at"]}这种形式取值。
3.自定义jspTag
timeTaglib.java
//可以继承SimpleTagSupport接口,也可以实现SimpleTag接口
public class timeTaglib extends SimpleTagSupport {
private Long longTimeHandler;
private PageContext pageContext//可以在自定义标准中设置各种属性,要接收属性,值自定义标签类必须实现setter方法
public void setLongTimeHandler(Long longTimeHandler) {
this.longTimeHandler = longTimeHandler;
}
//通过doTag方法处理,getJspContext()继承自父类public void doTag() throws JspException,IOException{
if (longTimeHandler != null) {
System.out.println("-----------------------");
//获取out对象,通过out输出
JspWriter out = getJspContext().getOut();//long转data,常用simpleDataFormat,DataFormat也可以
out.print(DateFormat.getInstance().format(longTimeHandler));
}
}
}
tld文件
<?xml version="1.0" encoding="ISO-8859-1"?>
<taglib xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
version="2.1">
<tlib-version>1.0</tlib-version>
<short-name>timeHandlerTaglib</short-name>
<uri>myTaglib</uri>
<!-- Invoke 'Generate' action to add tags or functions -->
<tag>
<name>timeTaglib</name>
<tag-class>com.jnshu.util.timeTaglib</tag-class>
<body-content>empty</body-content><!-- 入参设置-->
<attribute>
<name>longTimeHandler</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>
web.xml
jsp-config>
<taglib>
<!-- 映射路径,用于jsp头部uri声明-->
<taglib-uri>/Task4_page/mytaglib</taglib-uri>
<!--tld文件位置 -->
<taglib-location>/WEB-INF/tlds/taglib.tld</taglib-location>
</taglib>
</jsp-config>
jsp
<p class="text-p">更新时间:<ex:timeTaglib longTimeHandler="${Developer['create_at']}"></ex:timeTaglib>
</p>//注意取值格式
4.什么是jsp?
JSP全名为Java Server Pages,中文名叫java服务器页面,其根本是一个简化的Servlet设计
5.jsp有几个内置对象?
九大内置对象,四个作用域。
request请求/response响应/pageContext抽象类,上下文对象/session会话/application全局应用/out输出/config配置/page页面本身的对象/exception异常
application
在所有应用程序中有效
session
在当前会话中有效
request
在当前请求中有效
page
在当前页面有效
6.为什么要使用tiles框架?
页面模板复用,减少冗余
7.MapperScannerConfigurer和MapperScannerConfigurer
MapperScannerConfigurer是spring和mybatis整合的mybatis-spring jar包中提供的一个类。
想要了解该类的作用,就得先了解MapperFactoryBean。
MapperFactoryBean的出现为了代替手工使用SqlSessionDaoSupport或SqlSessionTemplate编写数据访问对象(DAO)的代码,使用动态代理实现。
比如下面这个官方文档中的配置:
<bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="mapperInterface" value="org.mybatis.spring.sample.mapper.UserMapper" />
<property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>
org.mybatis.spring.sample.mapper.UserMapper是一个接口,我们创建一个MapperFactoryBean实例,然后注入这个接口和sqlSessionFactory(mybatis中提供的SqlSessionFactory接口,MapperFactoryBean会使用SqlSessionFactory创建SqlSession)这两个属性。
之后想使用这个UserMapper接口的话,直接通过spring注入这个bean,然后就可以直接使用了,spring内部会创建一个这个接口的动态代理。
当发现要使用多个MapperFactoryBean的时候,一个一个定义肯定非常麻烦,于是mybatis-spring提供了MapperScannerConfigurer这个类,它将会查找类路径下的映射器并自动将它们创建成MapperFactoryBean。
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="org.mybatis.spring.sample.mapper" />
</bean>
这段配置会扫描org.mybatis.spring.sample.mapper下的所有接口,然后创建各自接口的动态代理类。
遇到的问题:
1.惨痛的教训,本地开发环境一定要与服务器运行环境一致。本地idea运行tomcat默认不加项目名,扔到服务器上就需要加项目名了,然后
静态资源全部访问不到,不得不重新配置。如果将静态资源放在WEB-INF下,需要SpringMVC配置静态资源映射,但映射location没项目名,问了师兄,需要通过${pageContext.request.contextPath}获取项目名并添加到资源应用处。
2.另一个无法解决的bug,使用SM注解自动注入dao层出现注入失败的异常。很奇怪的异常,费了很长时间。多亏志荣师兄帮我解决掉了。贴一段mybatis整合spring的代码。
<!-- 手写配置sqlsessionBean。Mybatis-Spring是mybatis提供的与spring整合的类 使用下面的方法注册映射接口,
有一个接口就需要注册一下,此时也可使用MapperScannerConfigrer,
Mybatis-Spring会自动为我们自动扫描注册Mapper对应的MapperFactoryBean对象
<bean id="StudentDAO" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="mapperInterface" value="com.jnshu.dao.StudentDAO"></property>
<property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
</bean>
<bean id="DeveloperDAO" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="mapperInterface" value="com.jnshu.dao.DeveloperDAO"></property>
<property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
</bean>-->
<!-- 注解方式配置。MapperScannerConfigrer开启注解自动扫描并指定扫描包,使用spring和mybatis的整合包 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.jnshu.dao" />
</bean>
3.师兄说代码结构不好,重构时犯了一个弱智错误,写了接口,写完了实现类,然后没写implements,找了半个小时错误才找到。。
另外不用java(xmlApplicationContext)代码写dao层的bean了,改成注解@Repository
明天的计划:
Task5
评论