首先,今天遇到一件贼拉闹心的事儿,就是这个标签引发的对JSP中代码加载顺序的思考
<jsp:forward page="index.jsp"></jsp:forward>
1、先说问题吧:(当前页面是 forward1.jsp)
页面永远直接跳转到forward3.jsp中去,没有forward1.jsp的输入框,是因为JSP会优先加载页面中的Java代码(也就是<% %>标签中的代码),所以s1中的值一开始就会是null而不是"123",就会直接走else中的代码,转发到forward3.jsp当中,根本不会有显示输入框的机会
<body>
<form action="forward1.jsp">
<input type="text" value="123" name="str1"/>
<button>提交</button>
</form>
<%
String s1 = request.getParameter("str1");
if("中文".equals(s1)){
%>
<jsp:forward page="forward2.jsp"></jsp:forward>
<%} else { %>
<jsp:forward page="forward3.jsp"></jsp:forward>
<%} %>
</body>
所以必须在前面加一项判断if(s1!=null),这么一来若输入"中文",那么代码就会自动转发到forward2.jsp当中去了
<body>
<form action="forward1.jsp">
<input type="text" value="123" name="str1"/>
<button>提交</button>
</form>
<%
String s1 = request.getParameter("str1");
if(s1!=null){
if("中文".equals(s1)){
%>
<jsp:forward page="forward2.jsp"></jsp:forward>
<%} else { %>
<jsp:forward page="forward3.jsp"></jsp:forward>
<%}} %>
</body>
2、结论:
- Java是在服务器端运行的代码,而javascript和html都是在浏览器端运行的代码,所以加载执行顺序是java>js=html
- 而JSP的加载顺序是从上至下的
- <% %>块语句相当于forward1_jsp.java中的java语句,所以会在服务器中优先运行结果并返回客户端,然后才会加载浏览器端的js代码
- forward1_jsp.java的源码如下
-
out.write("\t<body>\r\n"); out.write("\t\t<form action=\"forward1.jsp\">\r\n"); out.write("\t\t\t<input type=\"text\" value=\"123\" name=\"str1\"/>\r\n"); out.write("\t\t\t<button>提交</button>\r\n"); out.write("\t\t</form>\r\n"); out.write("\t\t\r\n"); out.write("\t\t"); String s1 = request.getParameter("str1"); if(s1!=null){ if("中文".equals(s1)){ out.write("\r\n"); out.write("\t\t"); if (true) { _jspx_page_context.forward("forward2.jsp"); return; } out.write("\r\n"); out.write("\t\t\r\n"); out.write("\t\t"); } else { out.write("\r\n"); out.write("\t\t"); if (true) { _jspx_page_context.forward("forward3.jsp"); return; } out.write("\r\n"); out.write("\t\t"); }} out.write("\r\n"); out.write("\t\t\r\n"); out.write("\t</body>\r\n");