- Servlet不支持HTML语法,生成网页需要通过response输出流输出,导致生成页面的代码非常复杂.JSP支持HTML语法,生成HTML页面比较简单
- JSP和Servlet的区别和关系?
- JSP和Servle都是用来动态生成网页的
- Servlet不支持HTML语法,生成网页麻烦
- JSP支持HTML语法,生成网页比较简单
- JSP运行时会被翻译成Servlet再执行.所以JSP就是Servlet
jsp脚本元素
- JSP中的脚本元素
- 声明
- 代码 : <%! %>
- 作用 : 声明的内容会被翻译成Servlet的成员变量, 方法和类 !
- 表达式
- 代码 : <%= %>
- 作用 : 用于向页面输出内容,等价于out.print(). 不能在内容后面添加";"分号
- 代码块
- 代码 : <% %>
- 作用 : 在其中书写任意Java代码.代码块可以和html嵌套使用
- 声明
jsp注释
-
jsp注释:jsp的注释只存在于jsp的源文件里面,在翻译成servlet的时候就消失了
<%-- 这是jsp的注释 --%>
- jsp中的java注释:和java一样不解释
- html注释:语法 :
- 不能阻止java代码和jsp的运行
jsp指令
-
page指令
import:用来导入包的
contentType:相当于response.setContentType();jsp页面相依的MIME类型
pageEncoding:设置的是保存时采用指定的字符编码集
errorPage:指定当前的页面发生错误的时候跳转到指定的页面
iserrorPage:设置某个页面是错误页面,设置为true以后,就可以通过exception过去错误信息
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
-
include指令(静态包含)
file指定的是要包裹进来的文件,会生成一个java文件
<%@ include file="index.jsp" %>
-
taglib指令
导入标签库
uri:命名空间,prefix:命名空间的名字
<%@ taglib url="" prefix="" %>
jsp内置对象
-
request
类型:HttpServletRequest 请求对象
-
response
类型:HttpServletResponse 响应对象
-
session
HttpSession 回话对象
-
application
ServletContext web应用全局唯一对象
-
config
ServletConfig 初始化数据
-
page
Object 当前jsp生成的servlet对象
如果一定要使用,需要强制转换成HttpServlet对象
Servlet有三种数据范围:request,session,servletcontext ,JSP在serlvet三种数据范围基础上,新增了page数据范围
-
pageContext
- PageContext 当前jsp上下文
-
可以向page范围存取数据
- findAttribute方法会依次在page 、request 、session 、 application 四个数据范围进行数据查找.如果找到了就不会往下查找
- 如果在EL表达式中直接使用 ${name}会调用findAttribute方法在四个范围中依次查找数据
-
可以获得其它八个隐含对象
- pageContext封装八个隐含对象的作用:框架编写,得到PageContext对象 相当于得到 JSP九个内置对象
-
exception
Throwable 当页面是一个错误页面,可以获取的对象
-
out
JspWriter 向输出流输出内容
jsp动作标签
-
jsp中6个动作标签
<jsp:useBean>:用于在page范围内查找指定名称的javaBean,如果找不到会创建一个User对象, 然后把这个对象赋值为zhangsan;
scope:定义那一个数据范围获取一个JavaBean;
class:全类名,包名+类名;
id:声明的变量名;
<jsp:useBean id="zhangsan" class="com.luoluo.User" scope="page" />
<jsp:setProperty>:用于在jsp页面中设置一个JavaBean属性 相当于调用了某属性的get方法
name:声明的变量的名字
value:属性值
property:属性名
<jsp:setProperty property="age" name="zhangsan" value="10" />
<jsp:getproperty>:用于在jsp页面中获取一个JavaBean属性 相当于调用了某属性的set方法
<jsp:getproperty property="age" name="zhangsan">
<jsp:include>等价于request.getRequestDispatcher().include() 动态包含
jsp:include和@include的区别
- @include是JSP指令,属于静态包含.在jsp翻译为Servlet时完成包含动作,包含的内容是目标页面翻译为Servlet时的源代码,最终只会生成一个Servlet
- jsp:include是JSP标签,属于动态包含.在servlet执行时完成包含动作,包含的内容是目标jsp翻译为Servlet生成的HTML页面,每个被包含的JSP都会生成一个单独的Servlet,所以最终会生成多个Servlet
<jsp:forward>等价于request.getRequestDispatcher.forward()
EL表达式
-
从数组中获取数据
${arr[0]}
-
从集合中获取数据
${list[0]}
-
从map集合中获取数据
- ${map["key"]} 得的值是value
- ${map.key} 得的值是value
-
empty运算符
可以用来判断一个对象是否为null,还可以判断是否为空
${empty list} //当list为null或size为0的时候,得出的结果都是true
-
三元运算符
${list == null ? " ": " "}
EL内置对象的使用
- 获取四个数据范围中的数据
- pageScope
- requestScope
- sessionScope
- applicationScope
- pageContext : 代表当前jsp上下文.通过该对象可以获取当前应用的路径${pageContext.request.contextPath },等价于<%=request.getContextPath() %>
- ${param.name} 等价于 request.getParameter("name")
- ${paramValues.hobby} 等价于 request.getParameterValues("hobby")
- ${header.referer} 等价于 request.getHeader("referer")
- ${headerValues["Accept-Encoding"]} 等价于 request.getHeaders("Accept-Encoding")
- ${initParam.name} 等价于 getServletContext().getInitParamter("name")
- cookie隐含对象写法
- ${cookie.address.value } : 等于从所有Cookie中找出name为address的Cookie,并将其中的值取出来JSTL标签库
核心标签库:
-
c:set
- 保存数据到四个数据范围
<% session.setAttribute("address","shenzhen"); %> <!-- scope用于指定数据范围 var:存数据的时候对应的key vlaue:存数据的时候对应的值--> <!-- 实现了和上面的一样的效果,往session里面存值 --> <c:set scope="session" var="address" value="shenzhen" />
- 修改四个数据范围中已存在对象的属性值
<% User user = new User(); user.setAge(16); pageContext.setAttribute("usr",user); %> <!-- target表示指定的对象 property:要修改的对象的属性--> <c:set target="${usr}" property="age" value="10" />
-
c:if
- 取代页面if条件判断
<% int a= 8; %> <c:if test="${a>10}"> a是大于10的 </c:if> <!-- 如果是else的业务逻辑,就用not关键字,里面的条件要用()括起来 --> <!-- var就是把判断语句的结果存到一个对象中,对象的名字就是var值,scope就是数据存储的范围 --> <c:if test="${not (a>10)}" var="result" scope="page"> a是小于10的 </c:if> <!-- 这样就可以取出if里面存储的值 --> ${result}
-
c:url
- 完成URL重写
- 结合从c:param进行中文的编码
<!-- context:当前应用的路径 下面的实例的路径相当于去找 /JSP/jstl/if.jsp 文件 --> <c:url context="/JSP" scope="" value="/jstl/if.jsp" var="encodeURL"> <!-- 在客户端禁用cookie的时候,可以重写URL的资源的路径,可以对中文进行转译 --> <c:param name="address">深圳</c:param> </c:url> <a href="encodeURL">这里会跳转到上面的URL指定的路径 </a>
-
c:foreach
- 遍历数组和集合
<% pageContext.setAttribute("arr",new int[]{1,2,3}); %> <!-- items:指定要遍历的对象 --> <!-- var:遍历的每一个元素 --> <c:foreach items="${arr}" var="a"> ${a} </c:foreach>
- 遍历map
<% Map map = new HashMap(); map.put("a","aaa"); map.put("b","bbb"); map.put("c","ccc"); pageContext.setAttribute("map",map) %> <c:foreach items="${map}" var="m"> ${m.key}==>${m.value} </c:foreach>
- foreach特殊的用法
<!-- 求1到100的和 --> <!--定义一个初始变量,初始值为0--> <c:set var="result" value="0" scope="page" /> <!--求和--> <!-- step:递增的时候每递增多少,默认值是1 --> <!-- varStatus:获取当前迭代的状态 --> <c:foreach begin="1" end="100" var="current" > <c:set var="result" value="${result+current}" scope="page"></c:set> </c:foreach> <!--打印值--> ${result}
-
c:redirect
<!--context是项目名 value是文件路径名--> <c:redirect context="/JSP" value="/demo1.jsp" ></c:redirect>