发表于: 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标签

禅道链接:http://task.ptteng.com/zentao/project-task-286.html


返回列表 返回列表
评论

    分享到