JSP
JSP通用于简化创建产生本文的Servlet,而Servlet更适合发送原生字节到客户端或使用Java源代码完全控制源代码的场合。
JSP适合做有页面的Servlet,Servlet适合做无页面,纯粹的业务处理页面,程序调用,请求转发等。
JSP运行机制:
第一次接收到对某个JSP页面的请求后,首先自动将该JSP页面翻译为Servlet代码。 JSP——> java,该代码在 部署的tomcat服务器上的work文件夹。,在JSP生命周期中,整个翻译和编译步骤只发生一次。
JSP,JSPX。编译——翻译:在第一次收到对某个JSP的页面的请求时发生,
<servlet-mapping>
<servlet-name>jsp</servlet-name>
<url-pattern>*.jsp</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>jsp</servlet-name>
<url-pattern>*.jspx</url-pattern>
</servlet-mapping>
以上XML配置文件说明:所有以.jsp为扩展名的URL的访问请求都由一个Servlet类 org.apache.jasper.servlet.JspServlet(该类在tomcat的jar包中)负责处理,这个类称为JSP引擎。JSP的部署自动完成。。
1.翻译
在第一次收到对某个JSP的页面的请求时发生,JSP->java
2.编译
在第一次收到对某个JSP的页面的请求时发生,java->class
3.装载阶段
该servlet会反射出其他的servlet?来进行对JSP的servlet装载?
4.实例化阶段:
Web容器创建Servlet实例,该JSP内涵的Servlet在容器上注册。,实例化一个对象
5.初始化阶段:
调用Servlet示例的jspInit()方法,允许JSP页面装在资源,至此servlet对象成为了一个完整的servlet,
6.JSP页面服务阶段,容器创建一个线程来处理访问JSP页面客户的请求,servlet对象的_jspService方法运行。
7.销毁
JSP书写说明:
声明:<%!声明变量(全局变量)%> 定义成类的属性。
Scriplet:<%代码,声明%> 声明出来的变量是局部变量,service()方法里面的变量
脚本表达式(输出变量的值) <%= 变量名 %>,直接输出到网页,可以嵌入html标签,将标签做成字符串形式即可,,但好像没有多大用??一般都是外部写标签,然后把<%=%>嵌入在标签里面,输出数据库查询列表的时候可用 内嵌标签的方式?
注释: <%-- --%>
由于jsp的内容相当于是servlet中的service(req,resp)方法中。,所以我们也可以直接使用req,resp参数来使用相关的方法。
JSP指令
提供整个JSP页面的相关信息,用于JSP页面和容器之间的通信,给容器看的
<%@ directive attribute="value1" attribute2 = "value2" %>
有三种类型的指令
page 为当前页面提供处理指令,配置指令
include,用于把另外一个文件包含在JSP中
taglib指定如何包含和访问自定义标签库;
contentType 向浏览器输出的编码格式和内容类型。
pageEncoding 是指当前文件存盘的编码格式。
设置错误页面
<%@ page isErrorPage="true"%>
错误信息out.print(exception.toString());
其他页面发生错误跳转到错误页面时,这样制定
<%@page errorPage="errorHandler.jsp"%>
<%@include%>这个为静态包裹文件,不能加入动态内容,例如xxServlet?id=xx,或者xxx.jsp?id=xxx;
<jsp:include page="localURl" flush="true">
localURL可以是动态文件flush只能是true;。
两个include的区别在于,它们被调用的事件,jsp:include在请求期间被激活,而include在页面转换期间被激活。
include只有一个Servlet,JSP:include(动作)可以多个
指令包含页面真实代码,动作包含响应代码
指令在编译时,动作在请求时
指令做出的修改必须要重启web服务,动作保存即生效
指令不能再请求去内共享对象,动作支持
指令适合静态,动作适合动态。
jsp标准动作:
<jsp:include page="head.jsp" flush="true" />
<jsp:include page="head.jsp" flush="true" />
<jsp:param name="aaa" value="ff"/>
</jsp:include>
jsp:forward动作,将客户端发出的请求,从一个JSP网页转发到另一个JSP网页,相当于servlet中的req.getRequestDispacher(url).forward(req,resp)
JSP隐式对象
request:
response:
pageContext :环境Context(上下文)变量(只针对该JSP(servlet);
session.
application: web应用程序的servletContext;
out: 就是resp.getWriter;
config: servlet相关的ServletConfig对象。
page: 相当于this,指代当前的servlet(jsp);
exception:异常对象
<jsp:useBean id="对象标识符" class="类的地址"/>
<jsp:setProperty name="对象名" property="属性名" value="属性值"/>
First Name: <jsp:getProperty name="对象名" property="属性名"/>
jsp MVC ,JSP+servlet + javaBean;
servlet中需要做的事:*将数据封装在请求(?)里面,然后派发到JSP页面,再由页面从request(作用域)中提取数据
- 1.取页面参数
- 2.进行参数的合法性检测
- 3.调用业务逻辑 (从数据库中取得数据或者操作数据)
- 4.将得到的数据(javaBean)放到作用域中(作用域.setAttribute)
- 5.进行页面的跳转(request.getRequestDispaCher(JSP).forward(req,resp))
EL语法
${expression}
${a+b}${c+d}//表示a+b的值拼接字符串上c+d的值。
[]运算符,跟js中的[]差不多,取得某个对象的某个属性,同样,[]的应用更广;
访问Map及遍历Map
<forEachItems="${Map}" var="item">
<c:outvalue="${item.key}"/>
<c:outvalue="${item.value}"/>
</forEach>
访问MAP
${map名[1]};注意,这个1在EL中默认是long类型,所以在设置map集合的时候,map.put(1L,value); 1是键名 ;
${map[键的值]}取得键对应的值; map.get(key)
${list[i]}取得数组下表map.get(i);
${javaBean[属性名]},调用javaBean里面的get方法;
取得header
${header["accept-language"]}
取得数组
${headerValues["accept-langueage"][0]}
检验一个值是否为null或者空
${empty X},是的话返回true
条件运算
${判断语句?A:B}
关闭jsp页面中的EL运算:
<%@ page isELIgnored="true" %>
在部署描述符中使用
<jsp-config>
<jsp-property-group>
<url-pattern>/noEL.jsp</url-pattern>
<el-ignored>true</el-ignored>
</jsp-property-group>
</jsp-config>
request.getContextPath()/index.jsp
无论index.jsp在什么位置,都路径都直接指向项目根目录下。
后台
List<Map<String,Object>> students = new ArrayList<Map<String,Object>>();
Map<String,Object> s1 = new HashMap<String,Object>();
s1.put("name","jim");
s1.put("age","15");
students.add(s1);
Map<String,Object> s2 = new HashMap<String,Object>();
s2.put("name","lucy")
s2.put("age","12");
students.add(s2);
```
<c:forEach var="student" items="$ {students}" >
<tr>
<span style="white-space:pre"> </span>
<td> <c:out value="$ {student.name}" default="wang"/>
</td>
<span style="white-space:pre"> </span>
<td>
<c:out value="$ {student.age}" default="wang"/>
</td>
</tr>
</c:forEach>
<%
List<String> list = new ArrayList<String>();
list.add("first");
list.add("second");
List<String> list2 = new ArrayList<String>();
list2.add("aaaaaa");
list2.add("bbbbbb");
Map<String,List<String>> map = new HashMap();
map.put("a",list);
map.put("b",list2);
request.setAttribute("map",map);
%>
通过键获得列表值,并遍历列表
<c:forEach var="item" items="${map['a']}">
${item }<br>
</c:forEach><br>
<c:forEach var="item" items="${map['b']}">
${item }<br>
</c:forEach>
map中值为列表,直接遍历列表中的每一项
<c:forEach var="item" items="${map}">
<c:forEach items="${item.value}" var="it">
${it }<br>
</c:forEach>
</c:forEach>