JSP页面的思考
一:JSP页面的Java代码与JS代码执行顺序
首先明确->Jsp的本质:用于页面展示的Servlet。(Servlet可以理解为运行在服务器中的一段代码。)
①:Jsp转化为对应.java文件、编译成可执行的.class文件的时候 ->将Jsp页面的脚本、el表达式、JSTL表达式完成”解析”。
②:用户请求到一个Servlet,服务器内部响应JSP页面时,执行JSP页面对应.class文件。依靠response对象以流的形式输出HTML、CSS、JS到客户端,由浏览器完成解析。
结论:JSP页面的Java代码(脚本、EL表达式、JSTL表达式等。。。)是在服务器执行的,JSP页面的JS代码是由response对象以流的形式输出到客户端浏览器,由浏览器完成加载执行的。
二:JSP页面中JS代码的执行顺序(与HTML页面中JS代码的执行顺序一致。)
①:自上而下。JS加载的顺序也就是页面中<script>标签出现的顺序。<script>标签里面的或者是引入的外部JS文件的执行顺序都是其语句出现的顺序,其中JS执行的过程也是页面装载的一部分。
②:onload事件在页面装载完成的时候才执行。
注意点:JSP页面中的JS代码可以嵌入JAVA代码。 (EL表达式、输出脚本动态给JS中的变量赋值。)这一部分在服务器内部就完成变量赋值。
var data=<%=emp.dept.deptid %>; 用JAVA脚本(建议EL表达式替代。)
var data="${emp.dept.deptid}"; //EL表达式需要加双引号
三:下拉框绑定后台数据
//绑定后台数据 1. select->指定Name
2. option中的value值绑定 id值(用于更新)
3. 显示值直接加到<option></option>中间
<select name="deptid">
<c:forEach var="dept" items="${requestScope.list }">
<option value="${dept.deptid }"} >${dept.deptname }</option>
</c:forEach>
</select>
四:给下拉框赋默认值
两种方案:
第一种: option中加入el表达式结合三元表达式。
<select name="deptid">
<c:forEach var="dept" items="${requestScope.list }">
<option value="${dept.deptid }" ${dept.deptid eq emp.dept.deptid ?"selected":""} >${dept.deptname }</option>
</c:forEach>
</select>
核心: ${dept.deptid eq emp.dept.deptid ?"selected":"" }
第二种:动态绑定部门id,响应到浏览器,由JS代码完成。
个人不建议这种: ① 在浏览器中右键,JS代码对别人是可见。 ② 其次这段JS代码不能放在外部链接内。因为外部链接的JS文件不能书写JAVA代码,也无法由服务器完成变量赋值。
//给body设置页面加载事件
<body onload="loding()">
</body>
// loding事件源代码
<script type="text/javascript">
function loding() {
var dept = "${emp.dept.deptid}";
var all = document.getElementsByTagName("option");
for (var i = 0; i < all.length; i++) {
if (dept == all[i].value)
all[i].selected = true;
}
}
</script>
//JSP页面数据绑定
<select name="deptid">
<c:forEach var="dept" items="${requestScope.list }">
<option value="${dept.deptid }" >${dept.deptname }</option>
</c:forEach>
</select>
五:图片Src为一个可访问的Action或Servlet ->生成验证码。
情况:注册页面
我将验证码的值存入Session中,在后台做验证。
我使用<s:debug />标签查看某些值的时候,发现session中并没有验证的值。这让我感到困惑。我尝试从session取出验证码的值,但是发现返回为空。
我注册Action却可以在后台取出Session中的验证码。
<img id="num" src="<s:url namespace='/' action='code' />" />
这是一个通过Struts2的Action绘制的一个验证码。
<s:url namespace='/' action='code' />
注册中Action可以取出值,说明session中确实有验证码,但是注册JSP页面为什么取不到值?
结论:图片的SRC为一个Action或Servlet时,在页面以输出流响应客户端时,浏览器执行到<img/>标签时,才会发起请求去访问这个Action,执行完毕时才会将验证码存入session中。在作用域中取值的操作在服务器端就完成了(Java代码在服务器器执行),那时Session中还没有验证码的值。
上一篇: PDF.js在页面的简单使用
下一篇: Jsp转Html页面的方法