发表于: 2017-09-04 14:19:35
2 927
今天完成的事情:
改需求了就要改代码
幸好我还啥也没弄还好改。如果我都做完了。。。算是理解了为什么开发都想要捅死PM了。
静态变动态
之前做了404界面的知识正好可以用上,用c标签和el表达式就可以实现
<div class="main-c row">
<h3 class="text-center main-tab">优秀学员展示</h3>
<ul class="list-unstyled text-center">
<c:forEach items="${students}" var="students" begin="0" end="3">
<li class="col-xs-12 col-sm-6 col-md-6 col-lg-3">
<div>
<%--<img src="${pageContext.request.contextPath}/t10/imges/242424.png">--%>
<img src="${students.picture}">
<span>${students.job}:${students.name}</span>
<p class="text-left">${students.profession}:${students.introduce}</p>
</div>
</li>
</c:forEach>
</ul>
</div>
items表示要循环的项目,var代表项目里的变量名,begin,end就没什么好说了,div用来给这块文档分区
数据库里可以存图片的路径,但是我不知道为什么如果指向本地图片的话显示出来的图片就会碎,只能传到images底下再用
路径里的坑
/表示根目录
./表示当前目录
../表示父级目录
我的图片路径是在webapp/t10/imges底下,webapp可以不管,所以写成./t10/imges才行,之前一直导不进去就因为路径不对
还有图片的像素最好都一致,否则问题也很大
结果如下,只能显示4个,上边设定的
实现动态显示在学人数和工作人数,嗯..
看程远大佬日报来的灵感
Mybatis 动态sql
动态sql通常要做的事情是有条件的包含where子句的一部分,比如:
<select id="findActiveBlogWithTitleLike"
resultType="Blog">
SELECT * FROM BLOG
WHERE state = ‘ACTIVE’
<if test="title != null">
AND title like #{title}
</if>
</select>
这条语句意思是一个可选的文本查找类型的功能。如果传入了"title",那么就会查找有"title"内容的blog返回;如果title为null,那么所有的处于active状态的blog都会返回。
如果想通过两个条件一起查询,那么只需要加入另一个条件就行了
<select id="findActiveBlogLike"
resultType="Blog">
SELECT * FROM BLOG WHERE state = ‘ACTIVE’
<if test="title != null">
AND title like #{title}
</if>
<if test="author != null and author.name != null">
AND author_name like #{author.name}
</if>
</select>
还有一种情况,我们可以提供了title就按title查找,提供了author就按author查找,嘛也没提供就返回所有,使用choose
<select id="findActiveBlogLike"
resultType="Blog">
SELECT * FROM BLOG WHERE state = ‘ACTIVE’
<choose>
<when test="title != null">
AND title like #{title}
</when>
<when test="author != null and author.name != null">
AND author_name like #{author.name}
</when>
<otherwise>
AND featured = 1
</otherwise>
</choose>
</select>
如果我这里的state属性也变成了可选的,该怎么办
<select id="findActiveBlogLike"
resultType="Blog">
SELECT * FROM BLOG
WHERE
<if test="state != null">
state = #{state}
</if>
<if test="title != null">
AND title like #{title}
</if>
<if test="author != null and author.name != null">
AND author_name like #{author.name}
</if>
</select>
讲道理这样写肯定是错的,傻子都看的出来如果这几项都是null,那么语句where后边就没东西了,而且如果后两项不为null的话,会变成 WHERE AND ...这也不对。
这里用一个where标签,它可以让语句在if有值的情况下才去插入WHERE子句,而且若最后的内容是"and"或"or"开头也会去掉
<select id="findActiveBlogLike"
resultType="Blog">
SELECT * FROM BLOG
<where>
<if test="state != null">
state = #{state}
</if>
<if test="title != null">
AND title like #{title}
</if>
<if test="author != null and author.name != null">
AND author_name like #{author.name}
</if>
</where>
</select>
还有trim,set foreach先不提了,用不到。
改造我的mapper配置文件
<select id="selectStudentNumber" parameterType="java.lang.Integer" resultType="java.lang.Integer">
SELECT
COUNT(id)
FROM goodstudent
<where>
<if test="studying != null">
AND studying LIKE #{studying}
</if>
</where>
</select>
查询studying字段,null则不进行条件判断,不为null就返回那个数据,COUNT(id)返回id个数
运行一下,果然出错了
nested exception is org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'studying' in 'class java.lang.Integer'.
错误原因:
Mybatis默认采用ONGL解析参数,所以会自动采用对象树的形式取String.studying,我这个是java.lang.Integer类型,肯定就报错了。
解决办法:
添加@Param("studying")到mapper里就行了
int selectStudentNumber(@Param("studying") Integer studying);
别的不用变,运行一下
稳的一批。还可以使用_parameter
<select id="selectStudentNumber" parameterType="java.lang.Integer" resultType="java.lang.Integer">
SELECT
COUNT(id)
FROM goodstudent
<where>
<if test="_parameter != null">
AND studying LIKE #{studying}
</if>
</where>
</select>
自定义tag标签实现Long类型转换成data类型
写一个类继承TagSupport
public class DateTag extends TagSupport {
private static Logger loggerDateTage = Logger.getLogger(DateTag.class);
private String value;
private String name;
public void setName(String name) {
this.name = name;
}
public void setValue(String value) {
this.value = value;
}
@Override
public int doStartTag() throws JspException {
//获取时间戳
String vv = ""+value ;
loggerDateTage.info("value: " + value);
loggerDateTage.info("vv: " + vv);
//把String的时间戳换为long型
//标签获取到的属性都为String
long time = Long.valueOf(vv);
loggerDateTage.info("time: " + time);
Calendar c = Calendar. getInstance();
//把时间戳换位毫秒级
c.setTimeInMillis(time);
SimpleDateFormat dateformat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss" );
//把毫秒级时间戳换为指定格式的时间
String s = dateformat.format(c.getTime());
//当name为空时不输出
if(name !=null) {
s = "\"" + name + "\": " + s;
}
else
loggerDateTage.info("s: " + s);
//在value输出s
try {
pageContext.getOut().write(s);
} catch (IOException e) {
e.printStackTrace();
}
return super.doStartTag();
}
}
编写tld文件
<?xml version="1.0" encoding= "UTF-8"?>
<taglib >
<tlib-version>1.0</tlib-version>
<jsp-version>2.0</jsp-version>
<short-name>Example TLD</short-name>
<tag>
<name>date</name>
<tag-class>com.jnshu.tag.DateTag</tag-class>
<body-content>JSP</body-content>
<attribute>
<description>The name of the property</description>
<name>name</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>value</name>
<required>true</required>
<type>com.jnshu.tag.DateTag</type>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>
在web.xml中加入引用
<jsp-config>
<taglib>
<taglib-uri>/tags</taglib-uri>
<taglib-location>/WEB-INF/tld/datetag.tld</taglib-location>
</taglib>
</jsp-config>
在jsp页面上写
<p class="text-left"><date:date name="入学时间" value ="${1504528029869}"/></p>
显示
现在我就想把creat_at直接导入date里边,但是用c:forEach就报错
an exception occurred processing jsp page
不是传值的问题,c:forEach能用,只是在这个里边用不了。我再研究研究
在jsp里加上这样的js代码
<head>
<SCRIPT LANGUAGE="JavaScript">
function gettime(){
var d = new Date();
document.getElementById("t").innerHTML =d;
window.setTimeout("gettime()",1000);
}
window.onload = gettime;
</SCRIPT>
</head>
<body><div id="t"></div>
</body>
可以实时显示时间。。前端的东西真是好用!
明天计划的事情:
小课堂,tiles框架
遇到的问题:
动态时间
收获:
动态sql,tag标签
评论