学习内容:学习JavaWeb(Day33)

1、Jsp
2、Jsp中的java代码
3、Jsp内置对象
4、Jsp标准标签


1、Jsp

(1)Tomcat服务器
Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。Tomcat是Apache 服务器的扩展,但运行时它是独立运行的,所以当你运行tomcat 时,它实际上作为一个与Apache 独立的进程单独运行的。
安装Tomcat后配置环境变量,双击Tomcat的bin目录下的startup.bat文件启动,使用浏览器访问端口http://localhost:8080/检查是否安装成功。Tomcat依托于JDK,必须在安装好JDK后才能成功启动。

(2)JSP(Java Server Pages)简介
JSP是sun公司设计的一种动态网页技术,部署于网络服务器上,可以响应客户端发送的请求,并根据请求内容动态地生成HTML、XML或其他格式文档的Web网页,然后返回给请求者。
jsp是一个类似于html的一个页面。 jsp直接存放到web目录下,访问jsp的时候,也和访问html一样(但是jsp不能拖拉到浏览中)

(3)JSP运行流程
客户端向一个jsp页面发送请求时,服务器(tomcat)的Web容器将jsp转化成servlet的源代码(只在第一次请求时),然后编译转化后的servlet并加载到内存中执行(调用service等方法),执行的结果response到客户端,例如:hello.jsp 会被翻译成hello_jsp.java(jsp是servlet的简易方式),jsp只在第一次执行的时候会转化成servlet,以后每次执行,web容器都是直接执行编译后的servlet,所以jsp和servlet只是在第一次执行的时候不一样,jsp慢一点,以后的执行都是相同的。
JavaWeb的Web端就是由jsp界面和servlet控制器组成的。执行jsp的过程实际上是执行servlet的过程,返回给客户端的页面是由servlet的方法生成的。我们之前写的Java程序是运行在虚拟机里的,现在Java是运行在服务器中的。
在服务器中具体路径:http://localhost:8080/应用名(项目名)/hello.jsp

2、Jsp中的java代码

(1)<%! %>声明脚本:成员变量,成员方法,内部类,注意叹号和百分号不能分开。这些java代码会被翻译到java文件中的类中。

<%!
    int a = 10;//成员变量
    public int sum(int a,int b){//成员方法
        return a+b;
    }
    static A{}//静态块
%>

(2)<%= %> 表达式,输出表达式的值,到html源代码中。会被翻译成servcie方法中 out.print()(service方法中)

<%=a%>//输出a的值

out 是jsp的一个内置对象,用于生成html的源代码。

(3)<% %>jsp程序脚本代码,可以嵌入任意java语句,会被翻译到servcie方法中。

<%
    int b = 5;//局部变量
    for (int i = 0; i < b; i++) {
        out.print(i);
    }
%>

(4)三种注释
html注释可以在网页上通过查看源代码查看到。

<!-- html注释 -->

java注释,只能修饰java代码

//  /* */ /** */

jsp注释,所有内容都可以注释掉,并且不能在网页上通过查看源代码查看到。

<%-- jsp注释--%>

(5)Jsp指令
1.page指令:
在jsp页面中可以通过page指令,声明当前的jsp页面中一些参数:例如:jsp的编码,需要引入的类的包路径等等信息。主要作用就是完成整个页面的配置。

<%@ page key=value key=value %>

在这里插入图片描述
在这里插入图片描述

2.include指令:
JSP中的include指令,主要是用来在当前的页面中引入其他的页面。这种引入方式成为静态的入,在翻译阶段就被引入进来,所有的jsp页面,合并到一个jsp翻译后的Java文件中。

<body>
    <%@ include file="logo.jsp" %>
    <%@ include file="main.jsp" %>
<body>

3、Jsp内置对象

(1)Jsp内置对象
jsp内可以直接使用的一些对象,这些对象由jsp本身就创建好了。
在这里插入图片描述

(2)Jsp四个作用域和对应的对象
page(pageContext)范围是当前页面
request(request)范围是一次请求,一次请求可以包含多个页面
session(session)范围是一次会话,一次会话可以包含多次请求
application(application)范围是整个应用,一个应用包含多个会话

(3)pageContext对象
pageContext:代表当前页面的上下文
作用域对象的公用的方法:从四个作用域中存、取、查找数据
setAttribute(Stringname,ObjceValue);
getAttribuet(String name);
findAttribute(String name);//没有返回null

pageContext.setAttribute("name","zhangsan");//往page作用域存入数据
out.print(pageContext.getAttribute("name"));//从page作用域获取数据,根据key获取value
out.print(pageContext.findAttribute("name"));//从域对象中依次查找

获取其他8个隐藏(内置)对象
getException();
getRequest();
getPage();
getResponse();
getServeletConfig();
getServeletContext();
getSession();

(4)request对象
在index.jsp文件中加入超链接,跳转到logo.jsp中

<a href="logo.jsp">跳转</a>

此时发生一次请求,可以在request作用域中存入数据

<%//logo.jsp中
    request.setAttribute("user","Jack");//往request作用域存入数据
    String user = (String)request.getAttribute("user");
    String user2 = (String)pageContext.getAttribute("user");//page作用域中没有存入数据
    out.print("request:" + user);//request:jack
    out.print("page" + user2);//page:null
%>

请求转发,把请求继续交给服务器上的另一个资源,这是服务器行为,客户端不知情,客户端还是只发送了一次请求,客户端浏览器地址栏没有变化。
此时点击index页面的跳转超链接后,浏览器地址栏显示logo.jsp,但显示的内容却是main.jsp打印的。

<%//logo.jsp中
    request.getRequestDispatcher("main.jsp").forward(request,response);//请求转发
%>
<%//main.jsp中
    String user3 = (String)request.getAttribute("user");
    out.print("request:" + user3);//request:Jack
%>

(5)session对象
不同用户(多个客户端)在访问服务器时,在服务器端创建不同的session容器,每个浏览器会生成不同的JSESSIONID,对应各自的容器,关闭浏览器session没有销毁,只不过丢失了JSESSIONID,所以找不到。通常把用户的相关信息保存在session中。

重定向,让客户端重新发送请求到服务器上的另一个资源,这是客户端行为,发送了两次请求,客户端浏览器地址栏发送了变化

<%//logo.jsp中
    session.setAttribute("user","Lucy");//往session作用域存入数据
    response.sendRedirect("main.jsp");//重定向
%>
<%//main.jsp中
    String user4 = (String)session.getAttribute("user");
    out.print("request:" + user4);//request:Lucy
%>

(6)application对象
保存的数据所有的Servlet和jsp都共享。它的范围最大,存活时间最长(服务器的启动到停止)。开发几乎不用。除非需要保存整个项目中共享的信息,并且内容小。才会使用。例如:统计一个网站被访问的次数。

<%//logo.jsp中
    application.setAttribute("user","Tom");//往application作用域存入数据
%>
<%//main.jsp中
    String user5 = (String)application.getAttribute("user");
    out.print("session:" + user5);//request:Tom
%>

(7)exception对象
要使用exception 必须要页面page指令里设置isErrorPage=true; 的属性。
使用exception.getMessage()方法返回错误

<%@ page contentType="text/html;charset=UTF-8" language="java" isErrorPage="true" %>
<body>
错误信息: <%=exception.getMessage()%>
</body>

(8)out对象
out是一个输出流,out是类jspWriter的实例对象。
可以使用out.print()方法和response.getWriter().print();方法在页面上输出。out输出流先放入out缓冲区再进入response输出流,最后输出到页面上。而response.getWriter().print();方法直接将要输出的内容放入response输出流,所以比out方法先打印。

4、Jsp标准标签

(1)jsp页面可以嵌入java代码实现业务逻辑。但是后期开发中很少在jsp中书写java代码。在jsp中提供了一些内置的标签,可以帮助我们减少java代码。直接书写,不需要导入任何东西。

(2)jsp:useBean、jsp:setProperty、jsp:getProperty标签
这三个标签可以操纵一个java对象:

<body>
    <!--相当于User user = new User();request.setAttribute("user",user)-->
    <jsp:useBean id="User" class="com.hisoft.javabean.User" scope="request"/>

    <!-- 相当于user.setName("李四") -->
    <jsp:setProperty name="User" property="userName" value="李四"/>

    <!-- 相当于out.print(user.getName()) -->
    <jsp:getProperty name="User" property="userName" />
</body>

(3)jsp:include标签
把其他页面的内容,加入到本页面。是动态引入其他页面,tomcat会把三个页面都翻译成java文件,再合并到浏览器中。

<body>
    <jsp:include page="logo.jsp">
</body>

区别:
1、jsp:include的引入方式,把其他的两个jsp也进行编译。因为编译成多个文件。所以里面的每个类中的变量都是单独存在的,不能混合使用。不能引入其他页面的定义的变量。
<%@ include 先转意成java文件的时候,就把另外两个文件的内容。加载到main_jsp.java中。这个时候如果一个页面定义了变量。在其他页面可以使用。

(3)jsp:forward标签
主要是代替我们在Servlet中学习的request的请求转发的。

<body>
    <!-- 相当于requets.getRequestdispatch(“index.jsp”).forword(request,respons); -->
    <jsp:forward page="main.jsp"/>
</body>

(4)使用jsp和jdbc查询数据

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐