发表于: 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&¶m.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用法有待加强,真好用!
评论