jsp


jsp就是servlet,其传统语法包含内容有: declaration,scriptlet,expression,comment,directives,Action,内置对象


declaration,scriptlet,expression

<%! 
    int a = 0;   // 第一种声明语法 declaration,加感叹号,是成员变量
 %>

<% 
    int b = 0;   // 第二种声明语法 scriptlet,不加感叹号,是局部变量,位于 servlet 的service方法体内
 %>

<%= ++a %>  // expression 等号后面只能是字符串变量或者可以转化为字符串的表达式,只有一行,不需要分号结尾
<%= ++b %>
<%= session.getId() %> // session 是内置对象,第一次使用 session 对象就会创建 session
<%= request.getPemeter("xxx") %> // request 是内置对象
不断刷新 jsp,a 输出累加, b 一直为 1


directive 编译指令 (相当于在编译期间的命令,注意,这个时候程序是还没有开始执行呢

格式:<%@directive 属性="属性值"%>     // 常见的 directive 有 page,include,taglib

page:
<%@page language="" // 现在只能写 java,不用管
        extends="" // jsp 继承于哪个类,因为jsp 就是 servlet ,肯定继承了某个相关类,所以一般这里不指定
        import="" // 导入某个类库
        buffer="none|kb size" // 默认是使用缓冲8k, 使用缓冲的意思是输出页面的时候先输出到内存里,再一次性画到页面上
        session="true|false"  // 是否能使用 session,默认true
        autoFlush="true|false" // 页面输出完之后是不是自动的 flush 到客户端,默认true
        isThreadSafe="true|false" // 是不是实现了 SingleThreadModel 接口(已废弃),默认false,很少用
        info="infoText" // jsp相关的描述性信息,很少用
        errorPage="error page url" // 这个页面出了错会显示哪个页面的内容
        isErrorPage="true|false" // 当前这个页面是不是一个显示错误的页面
        contentType="contentTypeInfo"
%>
// 只有红色的属性需要注意,其余的不用管

<%@page import="java.util.*, java.text.*"%> // 可以连着引入,或者写两条指令都行
<%@page contentType="text/html;charset=utf-8"%>


errorPage="abc.jsp" // 出错给我显示abc.jsp的内容

在abc.jsp里:
<%@page isErrorPage="true"%> // 必须有,表示这个 abc.jsp 是出了错后显示的页面
<%= exception.getMessage() %> // exception 表示当前出错的 exception 对象



include:
<%@include file="/xxx/cc/aa.jsp"%> // 注意 include 是编译指令,所以是先包含代码,再执行,效率比较高,但是不能传参数,如aa.jsp?a=1这样的


action 动作指令(在运行期间的命令)
// 常见的有 jsp:useBean   jsp:include   jsp:forward   jsp:plugin(嵌入applet小程序,已经很少用)

jsp:include
// 包含,在程序执行到这个语句的时候才会动态编译,可以使用子标签 jsp:param 传参数,下面的 flush 不用管,意思是另外一个网页的内容赶快输出
<jsp:include page="" flush="true">
    <jsp:param name="xxx" value="" />
</jsp:include>

jsp:forward
// 用于将一个 jsp 的内容传送到 page 所指定的 jsp 程序或 servlet 中处理  或者说是交给一个 URL 处理
<jsp:forward page="" flush="">
    <jsp:param name="xxx" value="" />
</jsp:forward>

jsp:useBean
// 在 jsp 中使用 java bean
<% A a = new A() %>
<jsp:useBean id="a" class="xxxx.xxx.a" scope="page|request|session|application" type="java.lang.Object">
</jsp:useBean>
<jsp:setProperty name="a" property="sss" value="11" />
<jsp:getProperty name="a" property="sss" />
// type 属性的意思是把这个对象当成什么对象使用,type="java.lang.Object" 相当于 Object a = new A()
// scope="page" 相当于尖括号里的作用域,就是局部变量,页面范围内有效,出了页面没人认识了


// scope="request" 在请求范围之内有效,先到request 里面找,有就拿,没有就创建,相当于同一个 request 里面有效
<%
    A a = (A)request.getAttribute("a");
    if (a == null) {request.setAttribute("a", a);}
%>
<jsp:forword page="xxxx.jsp" flush="true" />
// 那么在 xxxx.jsp 里面就能通过 <jsp:useBean id="" class="" scope="request"> 获取到,因为转发是同一个 request

<jsp:setProperty name="a" property="sss" param="11" />
// 注意这里是param,相当于value="<%= request.getParameter("11") %>"

// 还有一种怪异的用法:
// 比如有页面提交表单到 a.jsp 页面,a.jsp页面里面有如下代码:
// 这时 * 会根据提交表单的 name 属性从 request.getParameter 取值,再set,提交表单的 name 属性和模型里要一一对应,手写用得少,Structs里用的多
<jsp:useBean id="" class="" scope="request">
    <jsp:setProperty name="" property="*" />
</jsp:useBean>

// jsp:useBean 和写在尖括号里的代码是一个意思,只是另一种写法,这种写法更接近于标签而已


jsp:forward 和 response.sendRedirect(" ") 的区别

转发是发生在服务器端,对客户端来说是没有感知的,只请求了一次,使用的是同一个 request 对象(所以可传参数?xxx)

重定向对客户端来说是有感知的,重定向时服务器通知了客户端去请求新的地址,重定向请求了 2 次,使用的是 2 个 request 对象(所以不可传参数)



jsp 9 大内置对象

out
request
response
page 就是指当前页面,很少用,因为当前页面的内容我们能直接访问
pageContext 当前页面的上下文(或者说运行环境,和servletContext类似)
exception
session
config web.xml 对于当前 jsp 的配置application



jsp 和 servlet 之间的 通信

jsp 里可以通过 jsp:forward 和 response.sendRedirect( ) 到任何路径,包括servlet
servlet 到 jsp 重定向时一样的,但是转发麻烦点,如下代码:

public void doGet(HttpServletRequest request, HttpServletResponse response) {
    response.setContent("text/html;charset=utf-8");
    
    // 拿到 web.xml 对于当前 servlet 的配置,拿到上下文,再拿到分发器(整个web容器的路径管理者),然后转发,也可以是include把指定页面包含进来
    getServletConfig().getServletContext().getRequestDispatcher("/xxx/zzz.jsp").forward(request, response);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值