JavaWebJSP

Posted 王六六的IT日常

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaWebJSP相关的知识,希望对你有一定的参考价值。

JSP概述

JSP(全称Java Server Pages)是由 Sun Microsystems 公司倡导和许多公司参与共同创建的一种使软件开发者可以响应客户端请求,而动态生成 html、XML 或其他格式文档的Web网页的技术标准。从用户角度看待,就是一个网页。

程序员角度看待,其实是一个Java类,它继承了Servlet,所以可以直接说JSP就是一个Servlet

那为什么会有JSP?

HTML多数情况下用来显示一成不变的静态内容,但是有时候我们需要在网页上显示一些动态数据,比如:查询所有的学生信息、根据姓名去查询具体某个学生,这些动作都需要去查询数据库,然后在网页上显示,HTML是不支持写Java代码 ,JSP里面可以写Java代码。

JSP生命周期

JSP生命周期就是从创建到销毁的整个过程,类似于Servlet生命周期,区别在于:JSP生命周期还包括将JSP文件编译成Servlet。

以下是JSP生命周期中所走过的几个阶段:

  • 编译阶段:Servlet容器编译Servlet源文件生成Servlet类。
  • 初始化阶段:加载与JSP对应的Servlet类,创建其实例并调用它的初始化方法。
  • 执行阶段:调用与JSP对应的Servlet实例的服务方法。
  • 销毁阶段:调用与JSP对应的Servlet实例的销毁方法销毁Servlet实例。

JSP语法

JSP脚本程序

<% Java代码片段 %>
//示例
<% System.out.println("Hello"); %>

JSP变量声明

<%! 变量声明 %>
//示例
<%! int a = 10; int b = 20; %>

JSP表达式

一个JSP表达式中包含的脚本语言表达式,先被转化成String,然后插入到表达式出现的地方。

由于表达式的值会被转化成String,所以您可以在一个文本行中使用表达式而不用去管它是否是HTML标签。

表达式元素中可以包含任何符合Java语言规范的表达式,但是不能使用分号来结束表达式。

<%= 表达式 %>
//示例
<%= a %>

JSP注释

不同情况下使用注释的语法规则:

JSP指令元素

JSP指令用来设置整个JSP页面相关的属性,如网页的编码方式和脚本语言。

<%@ 指令 属性="值" %>

三种指令:

1.page指令

page指令为容器提供当前页面的使用说明,一个JSP页面可以包含多个page指令。

<%@ page 属性="值" %>

2.include指令

JSP可以通过include指令来包含其他文件,被包含的文件可以是JSP文件、HTML文件或文本文件,包含的文件就好像是该JSP文件的一部分,会被同时编译执行。

<%@ include file="文件相对url地址" %>

3.taglib指令

JSP允许用户自定义标签,一个自定义标签库就是自定义标签的集合,taglib指令引入一个自定义标签集合的定义,包括库路径、自定义标签。

<%@ taglib uri="uri" prefix="标签前缀" %>

JSP动作元素

与JSP指令元素不同的是,JSP动作元素在请求处理阶段起作用,利用JSP动作可以动态地插入文件、重用JavaBean组件、把用户重定向到另外的页面、为Java插件生成HTML代码。

<jsp:动作名称 属性="" />


JSP常见控制

if 语句

<%! int age = 19; %>
<% if ( age > 18 ) { %>
    <p>已成年</p><br />
<% } else { %>
    <p>未成年</p><br />
<% } %>

for语句

<%--for语句--%>
<%! int fontSize1 = 1; %>
<% for (fontSize1 = 1; fontSize1 <= 3; fontSize1++){ %>
    <font color="green" size="<%= fontSize1 %>">fontSize1</font><br />
<% } %>

JSP所支持的四大作用域:

  • pageContext 【PageContext】
    作用域仅限于当前的页面,还可以获取到其他八个内置对象。

  • request 【HttpServletRequest】
    作用域仅限于一次请求, 只要服务器对该请求做出了响应,这个域中存的值就没有了。

  • session 【HttpSession】
    作用域限于一次会话(多次请求与响应) 当中。

  • application 【ServletContext】
    整个工程都可以访问,服务器关闭后就不能访问了

EL表达式

EL概述

EL是为了简化咱们的jsp代码,具体一点就是为了简化在jsp里面写的那些java代码。
语法:
如果从作用域中取值,会先从小的作用域开始取,如果没有,就往下一个作用域取,一直把四个作用域取完都没有,就没有显示。

${ 表达式 }
<%如果域中所存的是对象:%>

<%
    User u = new User();
    u.setUsername("zhangsan");
    u.setPassword("123456");

    pageContext.setAttribute("u", u);
    request.setAttribute("u", u);
    session.setAttribute("u", u);
    application.setAttribute("u", u);
%>

<br>使用普通手段取出作用域中的值<br>

<%= ((User) pageContext.getAttribute("u")).getUsername() %>
<%= ((User) request.getAttribute("u")).getUsername() %>
<%= ((User) session.getAttribute("u")).getUsername() %>
<%= ((User) application.getAttribute("u")).getUsername() %>

<br>使用EL表达式取出作用域中的值<br>

<p>${ pageScope.u.username }</p>
<p>${ requestScope.u.username }</p>
<p>${ sessionScope.u.username }</p>
<p>${ applicationScope.u.username }</p>

//如果域中所存的是键值:

<%
    pageContext.setAttribute("name", "page");
    request.setAttribute("name", "request");
    session.setAttribute("name", "session");
    application.setAttribute("name", "application");
%>

<br>使用普通手段取出作用域中的值<br>

<%= pageContext.getAttribute("name") %>
<%= request.getAttribute("name") %>
<%= session.getAttribute("name") %>
<%= application.getAttribute("name") %>

<br>使用EL表达式取出作用域中的值<br>

${ pageScope.name }
${ requestScope.name }
${ sessionScope.name }
${ applicationScope.name }	

//如果域中所存的是数组:

<%
    String[] array = {"aa","bb","cc","dd"};

    pageContext.setAttribute("array", array);
    request.setAttribute("array", array);
    session.setAttribute("array", array);
    application.setAttribute("array", array);
%>

<br>使用普通手段取出作用域中的值<br>

<p><%= ((String[]) pageContext.getAttribute("array"))[0] %></p>
<p><%= ((String[]) request.getAttribute("array"))[0] %></p>
<p><%= ((String[]) session.getAttribute("array"))[0] %></p>
<p><%= ((String[]) application.getAttribute("array"))[0] %></p>

<br>使用EL表达式取出作用域中的值<br>

<p>${ pageScope.array[0] }</p>
<p>${ requestScope.array[0] }</p>
<p>${ sessionScope.array[0] }</p>
<p>${ applicationScope.array[0] }</p>

//如果域中锁存的是集合:

<%
    Map map = new HashMap();
    map.put("name", "zhangsan");
    map.put("age",18);

    pageContext.setAttribute("map", map);
    request.setAttribute("map", map);
    session.setAttribute("map", map);
    application.setAttribute("map", map);
%>

<br>使用普通手段取出作用域中的值<br>

<p><%= ((Map) pageContext.getAttribute("map")).get("name") %></p>
<p><%= ((Map) request.getAttribute("map")).get("name") %></p>
<p><%= ((Map) session.getAttribute("map")).get("name") %></p>
<p><%= ((Map) application.getAttribute("map")).get("name") %></p>

<br>使用EL表达式取出作用域中的值<br>

<p>${ pageScope.map.name }</p>
<p>${ requestScope.map.name }</p>
<p>${ sessionScope.map['name'] }</p>
<p>${ applicationScope.map['name'] }</p>

JSTL表达式

JSTL概述

JSTL(JSP Standard Tag Library,标准标签库)主要也是为了简化jsp的代码编写,替换 <%%> 写法,一般与EL表达式配合使用。

JSTL依赖

导入依赖库:jstl.jar、standard.jar
引入标签库:<%@ taglib prefix=“c” uri=“http://java.sun.com/jsp/jstl/core” %>

JSTL常用标签

c:set

<!-- 声明一个对象 myname,对象的值 zhangsan,存储到了 page(默认),指定是 session 域 -->
<c:set var="myname" value="zhangsan" scope="session"></c:set>
${ sessionScope.myname }

c:if

<c:set var="age" value="18" ></c:set>
<c:if test="${ age > 26 }">
    年龄大于了26岁...
</c:if>
<c:if test="${ age <= 26 }">
    年龄小于了26岁...
</c:if>

<%--定义一个变量名 flag,去接收前面表达式的值,然后存在 session 域中--%>
<c:if test="${ age > 26 }" var="flag" scope="session">
    年龄大于了26岁...
</c:if>

c:forEach

<%--从1开始遍历到10,得到的结果,赋值给 i,并且会存储到page域中,step代表增幅为2--%>
<c:forEach begin="1" end="10" var="i" step="2">
    ${i}
</c:forEach>

<%
    List<User> list = new ArrayList<User>();

    User u1 = new User();
    u1.setUsername("zhangsan");
    u1.setPassword("123456");
    list.add(u1);

    User u2 = new User();
    u2.setUsername("lisi");
    u2.setPassword("123456");
    list.add(u2);

    request.setAttribute("list",list);
%>
<!--items:表示遍历哪一个对象,注意这里必须写EL表达式。
	var:遍历出来的每一个元素用user去接收。 -->
<c:forEach var="user" items="${ list }">
    ${ user.username } ---- ${ user.password } <br />
</c:forEach>

以上是关于JavaWebJSP的主要内容,如果未能解决你的问题,请参考以下文章

JavaWebJSP原理,组成

JavaWebJSP-2

JavaWebJSP

JavaWebjsp页面的生命周期

JavaWebjsp页面中表单重复提交的三种情况

JavaWebJSP之3个指令6个动作9个内置对象和4大作用域