发表于: 2017-09-05 21:06:58

3 1006


今天完成的事情:

小课堂,上午准备了一波动态sql,结果发现没啥好讲的啊,而且重新写一个项目好麻烦。就改成了讲el表达式和c标签,也是最近在看的。

EL是JSP内置的表达式语言,用以访问页面的上下文以及不同作用域中的对象 ,取得对象属性的值,或执行简单的运算或判断操作。EL在得到某个数据时,会自动进行数据类型的转换。

EL表达式总是放在{}中,而且前边有一个$作为前缀,${}。

获取域中的对象可以直接使用对象名${student}获取对象的属性值可以直接通过“对象.属性名”${student.name},获取Map中属性时可以以直接通过属性的key${map.key}

在指定域中获取属性

${ pageScope .user}:当前页面

${requestScope.user}:当前请求

${sessionScope.user}:当前会话

${applicationScope.user}:当前应用

请求参数

参数对象只要用于获取get或post请求中的参数。

param:获取指定的请求参数,如${param.username}

paramValues:获取请求参数数组,如${paramValues.sport[1]}

由于EL表达式仅仅具有输出功能,而不替代页面中的JSP脚本片段.为了解决这个问题,JSP为我们提供了可以自定义标签库(Tag Library)的功能。

而为了方便开发使用Sun公司又定义了一套通用的标签库名为JSTL(JSP Standard Tag Library),里面定义很多我们开发中常用的方法,方便我们使用。c标签属于其中的核心标签。

要使用JSTL和EL表达式就必须引入两个jar包:standard.jar和jstl.jar

<dependency>
   <groupId>javax.servlet</groupId>
   <artifactId>jstl</artifactId>
   <version>1.2</version>
</dependency>
<dependency>
   <groupId>taglibs</groupId>
   <artifactId>standard</artifactId>
   <version>1.1.2</version>
</dependency>

然后还需要在JSP页面中通过taglib标签引入标签库。

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

核心标签:

<c:set> <c:out> <c:remove> 保存,输出,删除

<c:set value="123" var="aaa" scope="session"></c:set>
<c:out value="${aaa}"></c:out>
<c:remove var="aaa"></c:remove>
<c:out value="${aaa}"></c:out>

value表示值,var表示变量,scope表示作用域

<c:out value="${aaa}" default="默认值" escapeXml="true"></c:out>

<c:out>的属性default表示如果value为空,那么显示default里的默认值,如果不为空则不显示默认值。escapeXml表示是不是要转换特殊字符,默认为true。el表达式不能显示特殊字符,除非进行html转义,c标签就可以。

<c:if>条件语句,但是没有else,只能有一个条件判断

<c:if test="${aaa>200}" var="rrr">ttt</c:if>
<br>
<c:out value="${rrr}"></c:out>

这里aaa>200的话,把结果储存在rrr里,然后输出,true或者false

<c:choose> <c:when> <c:otherwise> 可以实现多条件判断,就像if...else...

<c:choose>
<c:when test="${param.IQ>140}">天才</c:when>
<c:when test="${param.IQ>90}">正常人</c:when>
<c:otherwise>智障</c:otherwise>
</c:choose>

el表达式里的param.IQ就是输入参数,在url里输入然后会进行判断。jsp的执行顺序是从上到下的,如果把IQ<90放到上边,那么满足条件的话IQ>140就不显示了。这里我们可以多加上一个条件

<c:choose>
<c:when test="${param.IQ>90&&param.IQ<140}">正常人</c:when>
<c:when test="${param.IQ>140}">天才</c:when>
<c:otherwise>智障</c:otherwise>
</c:choose>

这样就行了。

<c:forEach> 迭代,一个简单的例子之前也不知哪里错了没完成了

<c:forEach var="i" begin="0" end="10" step="2">
${i}
</c:forEach>

传入值的循环

<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>
               <p class="text-left"><date:date  name="入学时间" value ="${students.createAt}"/></p>
       </div>
   </li>
</c:forEach>

items属性表示要被迭代的信息

<c:import>把目标页面导入到当前页面 <c:redirect>重定向 <c:url>重写url,<c:param>写入属性

<c:import url="http://www.baidu.com" charEncoding="UTF-8"></c:import>
<c:redirect url="http://www.baidu.com"></c:redirect>
<c:url value="http://www.baidu.com" var="eee">
<c:param name="ttt" value="张三"></c:param>
</c:url>

然后是昨天的问题,自动转换时间Tag标签不能读取变量,问题在DateTag类里

private String value;

private String name;

public void setName(String name) {
this.name = name;
}

public void setValue(String value) {
this.value = value;
}

它定义的是String类型的value,而我数据库里传的是Long类型的,怪不得读取不了呢。所以说从网上找的例子自己用的时候全是bug。

改成Long之后再写入

<p class="text-left"><date:date  name="入学时间" value ="${students.createAt}"/></p>

还是报错啊。显示传入参数为null。额,经过一番谈论,发现了一件惊天地泣鬼神的事情!

creat_at和update_at两个字段根本传入不了list里,我一直都调用不到这两个。。然而id却可以,这三个都是Long类型。

问题出在mapper.xml里,用generator自动生成的代码它自动进行了转换

<resultMap id="BaseResultMap" type="com.jnshu.entities.Student" >
 <id column="id" property="id" jdbcType="BIGINT" />
 <result column="picture" property="picture" jdbcType="VARCHAR" />
 <result column="job" property="job" jdbcType="VARCHAR" />
 <result column="name" property="name" jdbcType="VARCHAR" />
 <result column="profession" property="profession" jdbcType="VARCHAR" />
 <result column="introduce" property="introduce" jdbcType="VARCHAR" />
 <result column="studying" property="studying" jdbcType="INTEGER" />
 <result column="create_at" property="createAt" jdbcType="BIGINT" />
 <result column="update_at" property="updateAt" jdbcType="BIGINT" />
</resultMap>

create_at和update_at自动变成了createAt和updateAt,我竟然一直没注意

那么问题就简单了,把list改一下

<select id="studentAll"  resultMap="BaseResultMap">
 SELECT * FROM goodstudent
</select>

好了,在访问就没问题了。

建第二动态页面,可能是晚上脑子不好使了,老出错。

先是ProfessionServiceImpl注入不了dao,然后发现确实是注入不了,spring配置文件里就没扫描这个类

<bean id="studentMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
   <property name="mapperInterface" value="com.jnshu.dao.StudentMapper"/>
   <property name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>

<bean id="managerMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
   <property name="mapperInterface" value="com.jnshu.dao.ProfessionMapper" />
   <property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>

问题来了,我这么写肯定是没问题,但是能不能直接扫描dao这个包呢,搞一下

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
   <!--给出要扫描的包的地址-->
   <property name="basePackage" value="com.jnshu.dao"/>
   <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
</bean>

然后。。两个都注入不了了。为什么啊,都用这个啊!

然后controller里service注入不了...卡了一会发现,Impl类里没加@Service注解,不想活了。。

然后还是不行,说是找不到list那个方法,去xml里看看...有毒,果然没这个方法,写上。

可以了,能正常访问了。可惜数据库里还没有任何数据,有时间添加一下。

然后有个字段我发现点问题

这个在学人数明显应该是学生啊,在profession表里根本没法弄成动态的,因为职位应该是固定的就那么几个,前端后端什么的,所以这里统计的应该是goodstudent表里的字段,就是加一个字段表示谁学前端,谁学后端。试一下

pid 1表示学后端,2表示学前端

又得改代码了,我的天

改啊改,写啊写,debug啊debug

成果如下

终于成功了!

随便贴一下代码吧,写不动了

service

public interface ProfessionService {
List<Profession> selectProfessionAll();
   int selectNumber(Integer pid);
}

Impl

@Service
public class ProfessionServiceImpl implements ProfessionService {
@Autowired
   private ProfessionMapper professionMapper;

   public List<Profession> selectProfessionAll(){
List<Profession> professions=professionMapper.selectProfessionAll();
       return professions;
   }
public int selectNumber( Integer pid){
int i = professionMapper.selectNumber(pid);
       return i;
   }
}

xml

<select id="selectNumber" parameterType="java.lang.Integer" resultType="java.lang.Integer">
   SELECT
COUNT(id)
FROM goodstudent
<where>
       <if test="_parameter=1">
           AND pid LIKE #{pid}
</if>
       <if test="_parameter=2">
           AND pid LIKE #{pid}
</if>
   </where>
</select>

controller

@Autowired
private ProfessionService professionService;
@RequestMapping(value = "/job",method = RequestMethod.GET)
public String professionAll(Model model){
int java =professionService.selectNumber(1);
   int css =professionService.selectNumber(2);
   List<Profession> professions=professionService.selectProfessionAll();
   model.addAttribute("java",java);
   model.addAttribute("css",css);
   model.addAttribute("professions",professions);
   return "t11";
}

jsp就算了,可能放不下。

我自己出现问题的点就是一直没想好怎么才能在profession里调用student的字段,后来试了一下在xml里直接写就可以,实现了是实现了,感觉还可以改进一下_(:з」∠)_

明天计划的事情:

人太少了讲小课堂就有点。。。这边没问题了就开始tiles吧

遇到的问题:

就是扫描dao包那个我咋用不了嘞

收获:

各种c标签,el表达式其他用法,实现了t11页面动态化,动态sql用法有待加强,真好用!

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


返回列表 返回列表
评论

    分享到