JavaWeb-JSP

JSP

JSP简介

Java Server Page,是前端交互的页面,与静态页面不同,JSP可以动态的处理用户的数据,其本质上是一种Servlet。

Servlet+JSP模式:

Servlet职责:

  • 接收参数

  • 处理业务逻辑

  • 将结果存到域对象中

  • 跳转到JSP页面

JSP职责:

  • 从域对象中取出数据
  • 将数据打印到前端中

开发原则:尽量不要再JSP页面中放入过多的Java代码

JSP原理

在早期没有JSP的年代,开发人员还是用Servlet,调用写方法,将HTML文件一行一行的写出去,达到向网站输出HTML文件与动态数据的目的,但是由于过于繁琐,后面开发出一种新的文件JSP,JSP看上去与HTML文件没什么不同,只是可以嵌套Java代码,具体流程是:

![在这里插入图片描述]( https://img-blog.csdnimg.cn/20210528182151507.png?x-oss-process=image/watermark ,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NjEyMjAzNg==,size_16,color_FFFFFF,t_70#pic_center)

当用户访问jsp资源时,服务器会根据jsp资源,自动生成java文件并且编译成class文件,而查看该class文件时可以发现, 该jsp会继承HttpJspBase类,而HttpJspBase类又是HttpServlet的子类,因此,访问jsp实际上就是在访问Servlet

本机的路径是C:\Users\12902\AppData\Local\JetBrains\IntelliJIdea2020.2\tomcat\Unnamed_JavaWeb_2\work\Catalina\localhost\Servlet_war_exploded\org\apache\jsp

在jsp所生成的class文件中,有些地方与servlet是类似的:

public void _jspInit() {
  }

public void _jspDestroy() {
}

public void _jspService(HttpServletRequest request,HttpServletResponse response){

}

另外,以index.jsp为例,打开其index_jsp.class文件,可以发现其中声明的内置对象:

final javax.servlet.jsp.PageContext pageContext;  //页面上下文
javax.servlet.http.HttpSession session = null;    //session对象
final javax.servlet.ServletContext application;   //ServletContext对象
final javax.servlet.ServletConfig config;         //config对象
javax.servlet.jsp.JspWriter out = null;			  //Writer对象
final java.lang.Object page = this;				  //当前Jsp对象
request  	//请求
response 	//响应

通用代码结构

![在这里插入图片描述]( https://img-blog.csdnimg.cn/20210528182225738.png?x-oss-process=image/watermark ,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NjEyMjAzNg==,size_16,color_FFFFFF,t_70#pic_center)

JSP指令

JSP有三大指令,分别是page,include,taglib

指令的作用:对当前JSP页面进行配置,可以理解成注解?

指令的格式

<%@page 属性名1=属性 属性名2=属性%>
  • page指令:

![在这里插入图片描述]( https://img-blog.csdnimg.cn/20210528183029297.png?x-oss-process=image/watermark ,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NjEyMjAzNg==,size_16,color_FFFFFF,t_70#pic_center)

  • include指令:

JSP可以通过include指令来包含其他文件,比如文本文件、JSP文件或HTML文件,包含的文件会被视为JSP文件中的一部分,会被同时编译执行。

语法格式:

<%--该指令会将两个页面合二为一--%>
<%@include file="path"%>


<%--该指令本质上还是两个页面,命名空间互不影响--%>
<%@include page="path"%>
  • taglib指令:JSP-API允许自定义标签,该指令引入一个自定义标签集合的定义,包含库路径和自定义标签。

基本语法

<%--注释--%>
<%//Java代码块%>


<%!
    //Java方法定义,成员定义
    %>

<%=
    //打印变量
    %>

常用内置对象

![在这里插入图片描述]( https://img-blog.csdnimg.cn/20210528183051568.png?x-oss-process=image/watermark ,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NjEyMjAzNg==,size_16,color_FFFFFF,t_70#pic_center)

request对象

request对象封装了客户端产生HTTP请求的所有细节,主要包括HTTP头信息、请求方式、请求参数、系统信息。通过request对象可以处理HTTP请求中的各项参数。

获取请求参数

通过超链接发送请求时,可以在后面加上?属性名1=属性1&&属性名2=属性2,来传递参数,会自动保存到request中, 跳转到该超链接的页面时,可以通过getParameter(String name)方法获取,该方法同样适用于表单提交。

作用域中管理属性

通过两个方法:

setAttribute与getAttribute方法来设置属性与获得属性。

需要注意的是request的作用范围:只在一次请求中有效。

获取Cookie

设置编码

设置编码的范围:浏览器向服务器发送的请求的编码

request.setCharacterEncoding("编码格式");

获取客户端信息

用request对象可以获取客户端的相关信息,如HTTP报头、客户信息提交方式、客户主机IP地址、端口号等。

常用方法:

![在这里插入图片描述]( https://img-blog.csdnimg.cn/20210528183107478.png?x-oss-process=image/watermark ,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NjEyMjAzNg==,size_16,color_FFFFFF,t_70#pic_center)

response对象

response对象用于响应客户端的请求,向客户端输出信息,封装了JSP产生的响应,并发送到客户端以响应客户端的请求,

响应的数据可以是任意类型的数据,甚至可以是文件

重定向网页

使用response对象的sendRedirect方法可以将网页重定向到另一个页面,重定向操作支持将地址重定向到不同的主机上,这一点与转发不同,重定向后,地址栏的URL会变成重定向网页后的URL,用户可以从地址栏看到重定向后的地址,重定向后,request中的属性失效,并重新新建一个request对象。

语法格式

response.sendRedirect(String path);

处理HTTP响应文件头

response.setHeader(String name,String value);

response对象可以处理HTTP响应文件头,常用于以下业务场景:禁用缓存,页面自动刷新和定时跳转网页

  • 禁用缓存:

默认情况下,浏览器会对显示的网页内容进行缓存,以提高浏览网页的速度,但是在一些安全性要求较高的网站,通常会禁用缓存

response.setHeader("Cache-Control", "no-store");
response.setDateHeader("Expires", 0);
  • 页面自动刷新
response.setHeader("Refresh", "10");
//单位秒
  • 定时跳转网页
response.setHeader("Refresh", "10;URL=login.jsp");

设置输出缓冲

通常情况下,服务器输出到浏览器的内容不会直接写到客户端,而是先写入输出缓冲区,缓冲区(文件输出或输入暂时储存的区域),打个比方:装卸车队和传送带,装卸车队装卸的粮食速度远超传送带,因此可以设置一个这样的站台,当要车队需要装粮食时,先将粮食置于该站台,达到一定数量,再叫车队过来装货,当要卸粮食时,先将车上的粮食置于站台,再让传送带慢慢传送走粮食,这样一个站台就起到了缓冲的作用。

response提供了以下方法来配置缓冲:

![在这里插入图片描述]( https://img-blog.csdnimg.cn/20210528183127878.png?x-oss-process=image/watermark ,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NjEyMjAzNg==,size_16,color_FFFFFF,t_70#pic_center)

session对象

Session,即会话,由于HTTP是一种无状态协议,就是说当一个用户发起请求给服务端,服务端处理请求,发出响应给客户端,连接就结束了,服务端并不保存任何信息,但是实际上可能需要服务端储存一些信息。为此引入了session,通过session,用户在进行浏览器跳转时,可以保存用户的状态,直到关闭浏览器,会话结束,session对象消失,另外当用户在同一个页面累计待一定的时间,超过超时时间时,session对象也会消失。

作用范围:用户关闭浏览器/在同一个页面待超过超时时间

常用方法:

![在这里插入图片描述]( https://img-blog.csdnimg.cn/20210528183138488.png?x-oss-process=image/watermark ,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NjEyMjAzNg==,size_16,color_FFFFFF,t_70#pic_center)

application对象

application对象用于储存所有用户、客户端共享的数据,在服务器创建时诞生,在服务器关闭时销毁,所有的用户共享该application对象,与session相比,生命周期更长,相当于全局变量。

常见方法:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VC8R9aCm-1622197163893)(C:\Users\12902\AppData\Roaming\Typora\typora-user-images\image-20210427165845457.png)]

比如一个业务需求:记录浏览器访问次数,就可以用到application。

  • 访问初始化参数

application对象提供了访问初始化参数的方法,应用程序的初始化参数在web.xml中进行配置,web.xml文件位于Web应用下的WEB-INF目录下,在web.xml文件中通过标记配置初始化参数。

比如:在web.xml中配置连接数据库所需的url参数

<content-param>
	<param-name>url</param-name>
    <param-value>jdbc:mysql://127.0.0.1:3306/db_database</param-value>
</content-param>

配置完毕后,怎么访问呢?

/*getInitParameter(String key)与getInitParameterNames方法*/
//方法一
String url = application.getInitParameter("url");

//获取初始化参数名的枚举
Enumberation<String> enums = application.getInitParameterNames();
while(enums.hasMoreElements()) {
    String name = enums.nextElement();
    String value = application.getInitParameter(name);
    out.print(name + ":" +value);
}
  • 管理应用程序属性

application应该是四大作用域中作用域最大的,只要服务器没有关闭,都是有效的。

application.setAttribute("username", "root");
application.setAttribute("visitTimes", 0);

String username = (String) application.getAttribute("username");

application.removeAttribute("visitTimes");

out对象

out对象用于向页面打印信息,还可以管理应用服务器上的输出缓冲区,在使用out对象输出数据时可以清除缓冲区中的数据,为其他数据让出空间。

  • 输出数据
out.print("nihao!");
out.println("world");
  • 管理输出缓冲区

out对象有另一个重要的作用就是对缓冲区进行管理,调用out的clear方法可以清除缓冲区中的内容,若响应已经提交会出现IOException异常,另外的一个方法clearBuffer则不会出现该异常。

![在这里插入图片描述]( https://img-blog.csdnimg.cn/202105281831518.png?x-oss-process=image/watermark ,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NjEyMjAzNg==,size_16,color_FFFFFF,t_70#pic_center)

pageContext对象

获取页面上下文对象,通过它可以获得request、response、session、application等对象

常用方法:

其中:forward方法等价于request的request.getRequestDispatcher("path").forward(request, response)

![在这里插入图片描述]( https://img-blog.csdnimg.cn/20210528183232548.png?x-oss-process=image/watermark ,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NjEyMjAzNg==,size_16,color_FFFFFF,t_70#pic_center)

四大作用域

四大作用域针对四个对象:pageContext、request、session、application都可以用来存放数据。

作用范围从小到大依次为:pageContext、request、session、application。

![在这里插入图片描述]( https://img-blog.csdnimg.cn/20210528183245106.png?x-oss-process=image/watermark ,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NjEyMjAzNg==,size_16,color_FFFFFF,t_70#pic_center)

存放数据的有效范围:

pageContext:只对当前页有效。

request:只支持一次请求,该请求可以被转发,数据属于一次性用品,比如:新闻弹出

session:用户关闭浏览器之前都是有效的。用户过一段时间还要用的数据,比如:购物车

application:服务器关闭之前,都是有效的。用户共用的数据,比如:浏览次数

EL表达式、JSTL标签

EL表达式

引入这些的EL表达式和JSTL标签的目的,就是在JSP尽量不要出现Java代码,JSP属于用户视图,若存在大量Java代码不便于后期维护。

使用前提:先将page指令中的isELIgnored设置为false,默认是true,表示是否忽略EL表达式。

使用场景:通常可以在某个作用域(pageContext,request,session,application)中取得属性值

特点:1.简单 2.自动转换类型

<%--通用格式--%>
${}

<%--从session中获取属性值--%>
${sessionScope.username}

<%--EL表达式比较字符串用单引号--%>
${sessionScope.username=='小明'}

JSP标签

JSP自带的标签有:include、forward、param

<%--标签的使用格式--%>
<jsp:include page="index.jsp">
  • include标签:

用于在当前位置包含另一个页面,页面之间相互独立,不共享命名空间

  • forward标签:

实现页面跳转,其实用Java代码也可以完成页面跳转,但是基于JSP里尽量不写Java代码的原则,尽量用标签。

  • param标签:通常与forward标签连用,实现在页面跳转时传递参数。

暂时常用的是这三个标签。

JSTL标签库

有时候想用标签执行一定的逻辑,用JSP自带的标签还不太够,为此引入了JSTL标签库。

步骤:

1.引入标签库(https://www.runoob.com/jsp/jsp-jstl.html)

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

2.引用标签

<%c:out value="${sessionScope.username}"%>

常用标签库及其示例

最常用的核心标签(C标签)

![在这里插入图片描述]( https://img-blog.csdnimg.cn/2021052818330630.png?x-oss-process=image/watermark ,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NjEyMjAzNg==,size_16,color_FFFFFF,t_70#pic_center)

  • c:if:
<body>
<%
    session.setAttribute("username", "小明");
%>
${sessionScope.username=='小明'}
<c:set var="password" value="1" scope="session" />
<%--test,boolean值,EL表达式可以用判断条件,但是如果是字符串的比较,用单引号--%>
<c:if test="${sessionScope.username=='小明'&& sessionScope.password=='2'}">
    <c:out value="芜湖!起飞"/>
</c:if>
</body>
  • c:foreach:
<body>
<%
    List<String> list = new ArrayList<>();
    list.add("rookie");
    list.add("theshy");
    list.add("ning");
    session.setAttribute("nameList",list);
%>
<%--items,待遍历的集合,var变量名相当于i,begin起始下标,end最终下标--%>    
<c:forEach var="item" begin="0" end="2" items="${sessionScope.nameList}">
    <c:out value="${item}"/> <br>
</c:forEach>

</body>

JavaBean

JavaBean简介

在经典的MVC三层架构中,M代表Model模型,V代表View视图,C代表Controller控制器,在JavaWeb项目中,模型由JavaBean充当,视图由JSP来充当,控制器由Servlet来充当。

JavaBean是一个遵循特定写法的Java类,具有以下特点:

  • 该类需包含一个无参构造函数
  • 该类中的属性需全部私有化
  • 所有属性需要对外提供get和set方法

JavaBean与数据库有所联系:

  • 表-->类名
  • 字段名-->属性
  • 行记录-->对象
public class UserInfo{
    
    private String username;
    private String password;
    public void setUsername(String username){
        this.username = username;
    }
    public String getUsername(){
        return this.username;
    }
    
    public void setPassword(String password){
        this.password = password;
    }
    public String getPassword(){
        return this.password;
    }
    
}

JSP中使用JavaBean

利用JSP的标签:jsp:useBean、jsp:setProperty、jsp:getProperty

  • jsp:userBean
<%--类比Java创建对象--%>
<%--UserInfo userInfo = new UserInfo();--%>
<jsp:useBean name="userInfo" class="UserInfo.class" scope="pageContext|request|session|application" />
  • jsp:setProperty
<%--相当于调用了set方法--%>
<%--写法一--%>
<jsp:setProperty name="userInfo" property="username" value="String字符串|EL表达式" />

<%--写法二--%>
<jsp:setProperty name="userInfo" property="password" param="parameterName"	/>
  • jsp:getProperty
<%--相当于调用了get方法--%>
<jsp:getProperty name="userInfo" property="password" />
posted @ 2021-05-28 19:21  Code_Ice  阅读(92)  评论(0)    收藏  举报