javaweb:JSP快速入门

版权声明: https://blog.csdn.net/weixin_42442713/article/details/84185570

使用jsp的原因:

Servlet的缺点:

Servlet技术:

缺点:不适合设置html响应体,需要大量的response.getWriter().print("<html>")

优点:动态资源,可以编程。l html技术:

缺点:html是静态页面,不能包含动态信息

优点:不用为输出html标签而发愁

jsp(java server pages)

优点:在原有html的基础上添加java脚本,构成jsp页面。

JSP简介:

JSP(Java Server Pages)Java Servlet一样,是在服务器端执行的

不同的是先由服务器编译部署成Servlet执行

JSP的组成

jsp = html + java脚本 + jsp标签(指令)

jsp中无需创建即可使用的对象一共有9个,被称之为9大内置对象。例如:request对象、out对象

JSP的脚本元素

<%...%>java代码片段(常用)

<%=...%>java表达式,用于输出(常用)

<%!...%>:声明,用来创建类的成员变量和成员方法(基本不用,但容易被考到)

JSP 脚本元素:

<%!       %>:这里面的代码相当于java中的全局变量或方法声明和赋值

<%        %>:在里面的代码相当于java中的println输出内容

<%         %>:在里面的代码相当于java的局部变量和java程序代码。

Declaration(声明):

l声明的格式: <%! 声明1[声明2]……%>

l声明的作用范围是整个JSP页面,同时它只在一个JSP页面有效

l声明的类型包括:变量,方法,类

Jsp的注释:

存在下面的两种注释方法:

JSP注释:<%-- … --%>,转化阶段消失,只能被开发人员看到

JAVA注释:///**//***/,编译阶段消失

HTML注释:<!-- … -->, 不会消失,在页面中也能看到

注意:在Jsp中的注释我们推荐使用Jsp的注释方法,因为很多情况下,如果我们的Jsp代码中含有Jsp的标签,那么使用html注释该标签将会不起作用。

Expression(表达式):

l语法格式

<%= 变量或表达式 %>

l表达式的计算结果转换成字符串

使用隐含对象out进行输出

l范例

<%=“abc” %> 等价于 out.print(“abc”);

lJSP脚本表达式中的变量或表达式后面不能有分号(;

Scriptlets(代码块):

l语法格式

<%  java code  %>

l在“<%”和”%>”之间插入java程序片,一个JSP页面可以有许多程序片,这些代码块将被JSP服务器按照顺序执行

在一个代码块中声明的变量是JSP页面的局部变量,只在当前页面有效

JSP的运行原理:

ljsp其实是一种特殊的Servlet

l    > jsp页面第一次被访问时,服务器会把jsp编译成java文件(这个java其实是一个servlet类)

l    > 然后再把java编译成.class

l    > 然后创建该类对象

l    > 最后调用它的service()方法

l    > 第二次请求同一jsp时,直接调用service()方法。

JSP程序的翻译过程:

JSPServlet的分工:

一个例子

jiaServlet.java:

package cn.itcast.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 处理求和的操作
 * @author Administrator
 *
 */
public class JiaServlet extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		/**
		 * 1.获取请求参数
		 * 2.求和
		 * 3.使用转发或者重定向到成功页面
		 */
		// 获取请求参数
		String num1 = request.getParameter("num1");
		String num2 = request.getParameter("num2");
		int num11 = Integer.parseInt(num1);
		int num22 = Integer.parseInt(num2);
		int result = num11 + num22;
		
		// 找到成功的页面
		// 使用重定向或者转发
		request.setAttribute("result", result);
		// 只能使用转发了(/jsp/he.jsp)
		request.getRequestDispatcher("/jsp/he.jsp").forward(request, response);
		
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		doGet(request, response);
	}

}

he.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>

<%
	Integer result = (Integer)request.getAttribute("result");
%>

<h3>显示成功的结果:<%= result %> </h3>

</body>
</html>

jia.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>

<form action="/day11/jia" method="post">
	整数1:<input type="text" name="num1" /><br/>
	整数2:<input type="text" name="num2" /><br/>
	<input type="submit" value="提交" />
</form>

</body>
</html>

JSP

作为请求发起页面,例如显示表单、超链接。

作为请求结束页面,例如显示数据。

lServlet

作为请求中处理数据的环节。

jsp三大指令:
page

 

page指令标记:

page属性包含在“<%@ page ”和“%>”之间。

<%@page language=”java” info=”xxx”…%>**

这些属性可以单独使用,也可以几个或多个同时使用

page指令用来定义JSP文件的全局属性

JSP页面中,只有import可以出现多次,其它属性都只能出现一次

page指令标记:

pageEncoding和contentType: 
pageEncoding:它指定当前jsp页面的编码,只要不说谎,就不会有乱码!在服务器要把jsp编译成.java时需要使用pageEncoding! 
contentType:它表示添加一个响应头:Content-Type!等同与response.setContentType(“text/html;charset=utf-8”); 
如果两个属性只提供一个,那么另一个的默认值为设置那一个。 
如果两个属性都没有设置,那么默认为iso
import:导包!可以出现多次
errorPage和isErrorPage 
errorPage:当前页面如果抛出异常,那么要转发到哪一个页面,由errorPage来指定 
isErrorPage:它指定当前页面是否为处理错误的页面!当该属性为true时,这个页面会设置状态码为500!而且这个页面可以使用9大内置对象中的exception!
<error-page>有两种使用方式:
<error-code>和<location>子元素;
<exception-type>和<location>子元素;
其中<error-code>是指定响应码;<location>指定转发的页面;<exception-type>是指定抛出的异常类型。

在web.xml中配置



 <error-page>
    <error-code>404</error-code>
    <location>/error/errorPage.jsp</location>
 </error-page>
      <error-page>
 <exception-type>java.lang.RuntimeException</exception-type>
        <location>/index.jsp</location>
      </error-page>

autoFlush和buffer 
autoFlush:指定jsp的输出流缓冲区满时,是否自动刷新!默认为true,如果为false,那么在缓冲区满时抛出异常! 
buffer:指定缓冲区大小,默认为8kb,通常不需要修改!
isELIgnored:是否忽略el表达式,默认值为false,不忽略,即支持!
(以下了解即可): 
language:指定当前jsp编译后的语言类型,默认值为java。 
info:信息! 
isThreadSafe:当前的jsp是否支持并发访问! 
session:当前页面是否支持session,如果为false,那么当前页面就没有session这个内置对象! 
extends:让jsp生成的servlet去继承该属性指定的类!
include –> 静态包含:

与RequestDispatcher的include()方法的功能相似!他们共同生成一个java(就是一个servlet)文件,然后再生成一个class!
RequestDispatcher的include()是一个方法,包含和被包含的是两个servlet,即两个.class!他们只是把响应的内容在运行时合并了!

linclude指令的语法格式如下

<%@ include file=“filename” %>

linclude指令的作用是在JSP页面中静态包含一个文件,同时由JSP解析包含的文件内容

作用:把页面分解了,使用包含的方式组合在一起,这样一个页面中不变的部分,就是一个独立jsp,而我们只需要处理变化的页面。

l静态包含的含义

file不能为一变量

<% String url="index.html" ; %>

<%@ include file = "<%= url %>" %>

不可以在file 所指定的文件后接任何参数

<%@ include file = "jw.jsp?nm=browser" %>

静态包含举例:

l包含的是目标文件的源码;包含过来,一起翻译

lmain.jsp

<%

    String s = “abc”;

%>

<%include file=“part.jsp” %>

part.jsp

<%=s %> 没有定义变量s

尽管part.jsp本身会有错误

但是运行main.jsp就可以正确引入part.jsp



taglib –> 导入标签库:
两个属性: 
prefix:指定标签库在本页面中的前缀!由我们自己来起名称! 
uri: 指定标签库的位置! 
<%@taglib prefix=”s” uri=”/struts-tags”%> 前缀的用法<s:text>

九大内置对象:

在jsp中无需声明即可直接使用的9个对象 
out(JspWriter):等同与response.getWriter(),用来向客户端发送文本数据;
config(ServletConfig):对应“真身”中的ServletConfig;
page(当前JSP的真身类型):当前JSP页面的“this”,即当前对象,引用为Object类型;
pageContext(PageContext):页面上下文对象,它是最后一个没讲的域对象;
exception(Throwable):只有在错误页面中可以使用这个对象;
request(HttpServletRequest):即HttpServletRequest类的对象;
response(HttpServletResponse):即HttpServletResponse类的对象;
application(ServletContext):即ServletContext类的对象;
session(HttpSession):即HttpSession类的对象,不是每个JSP页面中都可以使用,如果在某个JSP页面中设置<%@page session=”false”%>,说明这个页面不能使用session。
pageContext(一个顶9个!) 
Servlet中有三大域,而JSP中有四大域! 
ServletContext:整个应用程序 
session:整个会话(一个会话中只有一个用户) 
request:一个请求链! 
pageContext:一个jsp页面!这个域是在当前jsp页面和当前jsp页面中使用的标签之间共享数据! 
域对象 
代理其他域:pageContext.setAttribute(“xxx”, “XXX”, PageContext.SESSION_SCOPE); 
全域查找:pageContext.findAttribute(“xxx”);从小到大,依赖查找! 
获取其他8个内置对象:

内置对象的类型:

request                   HttpServletRequest

response                HttpServletResponse

session                   HttpSession

application             ServletContext

config                     ServletConfig

page                       this (HttpServlet)

pageContext            PageContext

exception               Throwable (所有异常父类)

out                          JspWriter     

exception对象:

exception对象是java.lang.Trowable类的实例

(使用前 isErrorPage=“true”)

exception对象用来处理JSP文件在执行时所有发生的错误和异常

exception对象可以和page指令一起使用,通过指定某一个页面为错误处理页面,对错误进行处理

<%@ page isErrorPage=”true “%>的页面内使用

page对象  ---- Servlet对象:

page” 对象代表了正在运行的由JSP文件产生的类对象 一般不建议使用

page对象是指向当前JSP程序本身的对象this

page对象其实是java.lang.Object类的实例对象

out对象:

向客户端输出数据

管理服务器输出缓冲区

内部使用PrintWriter对象来输出文本级数据

通过page指令的buffer属性来调整缓冲区的大小,默认的缓冲区是8kb

out隐式对象的工作原理图 :

pageContext对象:

pageContext也是域对象,代表当前的页面范围,在当前的页面范围内获取数据。

JSP的四个作用域范围内存数据。

Servlet中有三个域,而JSP有四个域。

JSP中多了pageContext的域范围,代表当前页面范围。

获取其他8个内置对象。

编写框架、通用性较高的代码。

pageContext对象可以直译为“页面上下文”对象,代表的是当前页面运行的一些属性

它是javax.servlet.jsp.PageContext类的实例对象,可以使用PageContext类的方法。pageContext对象提供了对JSP页面所有的对象及命名空间的访问

提供了page范围的存取方法

Object getAttribute(String name)

void removeAttribute(String name)

void setAttribute(String name, Object value)

findAttribute方法 (*重点,查找各个域中的属性

通过pageContext获得其他对象 :

getException方法返回exception隐式对象

getPage方法返回page隐式对象

getRequest方法返回request隐式对象

getResponse方法返回response隐式对象

getServletConfig方法返回config隐式对象

getServletContext方法返回application隐式对象

getSession方法返回session隐式对象

getOut方法返回out隐式对象

JSP的四种数据范围:

对象  scope

pageContext  page范围   

request  请求范围

session  会话范围 

application  应用范围

JSP动作标签:

JSP标签也称之为Jsp Action(JSP动作)元素,它用于在Jsp页面中提供业务逻辑功能,避免在JSP页面中直接编写java代码,造成jsp页面难以维护。

这些JSP的动作标签,与HTML的标签有本质上的区别,动作标签是由Tomcat(服务器)来解释执行的,都是在服务器端执行的。HTML标签是由浏览器执行的。

JSP常用标签:

<jsp:useBean>

使用一个ID和一个给定作用范围和同一IDJavaBean相关联

<jsp:setProperty>

设置JavaBean的属性值

<jsp:getProperty>

取得JavaBean的属性值

<jsp:include

文件包含(服务器端路径,没有项目名称

动态包含原理:

<jsp:forward>

JSP的页面中完成转发(服务器端路径,没有项目名称

<jsp:param>

需要写在<jsp:forward>的中间

<jsp:include> 
例如:<jsp:include page="xxx"/>,用来包含指定的页面。假如有两个jsp. 分别为a.jsp和b.jsp,他们分别编码成Servlet,然后在执行Servlet时才会执行包含过程。这也是include指令与include标签的区别。 
注意:<jsp:include page="<%=myfile%>">,这是可以的!因为include指令是在执行时才完成的包含,在执行时已经可以确定myfile这个变量的值。

该标签内部使用的是RequestDispatcher#include()方法完成的包含
<jsp:forward> 
例如:<jsp:forward page="xxx"/>,用来转发到指定页面 
例如在a.jsp中存在如下内容:<jsp:fowrad page="b.jsp"/> 
a.jsp中的内容不会显示在浏览器上,而只是显示b.jsp的内容。而且在<jsp:forwad>标签下面的内容不会被执行。
<jsp:param> 
该标签是和的子标签,用来向其他页面传递参数。
 <jsp:include>include指令的比较 :

<jsp:include>标签是动态引入, <jsp:include>标签涉及到的2JSP页面会被翻译成2servlet,这2servlet的内容在执行时进行合并。

include指令是静态引入,涉及到的2JSP页面会被翻译成一个servlet,其内容是在源文件级别进行合并。

不管是<jsp:include>标签,还是include指令,它们都会把两个JSP页面内容合并输出,所以这两个页面不要出现重复的HTML全局架构标签,否则输出给客户端的内容将会是一个格式混乱的HTML文档。

两种include用法的区别:

猜你喜欢

转载自blog.csdn.net/weixin_42442713/article/details/84185570