当前位置: 首页 > news >正文

JSP --学习

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

最近因为项目需要,用到了jsp技术,因此学习下

1..JSP简介

1.1 全称java server pages,它是一种动态网页开发技术。

1.2 基于它开发的web应用可以跨平台(Linux/Windows)使用。

1.3 使用jsp标签在HTML网页中插入java代码,标签通常以<%开头,以%>结束。

2.JSP结构

网络服务器需要一个容器来处理JSP页面,该容器负责截获对JSP页面的请求。常用的容器是Apache系列的Tomcat。

3.JSP处理流程

3.1 客户端通过浏览器向服务器发送一个http请求。--发请求

3.2 web服务器识别出这是一个对jsp网页的请求,并将该请求传递给jsp容器。--识别xx.jsp文件

3.3 jsp容器从磁盘中载入JSP文件,然后将他们转换成servlet,并将所有的JSP元素转换成java。 --转换成xx_servlet.java文件

3.4 jsp容器将servlet编译成可执行类,并将原始请求传递给servlet引擎。--编译成xx_servlet.class

3.5 WEB服务器调用servlet引擎,载入执行servlet类。-- 容器中执行servlet

3.6 WEB服务器以静态HTML网页形式将HTTP response返回到客户端浏览器中。--返回给客户端

3.7 浏览器处理HTTP response中动态产生的HTML文件(类似处理静态网页一样)。

4.JSP生命周期

4.1 JSP编译

浏览器请求JSP页面时,JSP引擎首先会检查是否需要编译这个文件,如果这个文件没有被编译过,或是上次编译后被更改过,则需要编译这个JSP文件。

编译过程三个步骤

1>解析JSP文件

2>将JSP文件转换成servlet

3>编译servlet

4.2 JSP初始化

容器载入JSP文件后,它会调用jspInit()方法。

一般来说程序只会初始化一次,servlet也是如此。通常情况下我们可以在jspInit()方法中初始化数据库连接、打开文件和创建查询等。

4.3 JSP执行

这个阶段完成了JSP生命周期中所有与请求相关的交互行为。

当JSP网页完成初始化后,JSP引擎调用jspService()方法,该方法需要一个httpServletRequest对象和httpServletResponse对象作为参数,该方法在每个request中被调用一次并负责产生与之相对应的response,还负责产生http方法的回应,如get、post等等。

4.4 JSP清理

比如释放数据库连接或者关闭文件夹等。

5 JSP语法

5.1 jsp是一种脚本语言,语法格式如下:

<% 代码片段 %>

5.2 任何文本、HTML标签、jsp元素都应该写在脚本程序的外面

如下示例

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<!DOCTYPE html>

<html> <head> <title>第一个JSP程序</title> </head> <body> <% out.println("Hello World!"); %> </body> </html>

5.3 JSP声明

JSP声明语法格式如下

<% ! 声明1;声明2;……%>

程序示例

<%! int i = 0; %> <%! int a,b,c; %> <%! UserInfo userInfo = new UserInfo('lxl','0','29')%>

5.4 JSP表达式

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

JSP表达式的语法格式如下

<%= 表达式 %>

程序示例

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<!DOCTYPE html>

<html> <head> <title>第一个JSP程序</title> </head> <body> <p> Today's date:<%= (new java.util.Date()).toLocaleString()%> </p> </body> </html>

运行后得到如下结果

Today's date:2016-3-23 15:46:01

5.5 JSP注释

JSP注释语法格式如下

<%!-- JSP注释 --%>

5.6 JSP指令

JSP指令用来设置与整个JSP页面相关的属性。

JSP指令语法格式如下

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

常用的三种指令标签

<%@ page 属性= ...... %> 定义页面的依赖属性,比如页面的编码格式 <%@ include 属性= ...... %> 定义包含其他文件 <%@ taglib 属性= ...... %> 定义引入标签库

5.7 JSP控制流语句

JSP提供对java语言的全面支持,我们可以在JSP程序中使用java api、使用控制语句等。

示例如下

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<%-- 该部分注释在网页中不会被显示--%> <%! int day = 3; %>

<!DOCTYPE html>

<html> <head> <title>第一个JSP程序</title> </head> <body> <% if (day == 3) { %> <p> Today is 3</p> <% } else { %> <p> Today is not 3 </p> <% } %> </body> </html>

5.8 JSP运算符

JSP支持所有java逻辑和算术运算符。

6 JSP指令

JSP指令用来设置整个JSP页面相关的属性,如网页编码格式等。

语法格式如下:

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

指令可以有多个属性,它们以键值对的形式存在,并用逗号隔开。

jsp三种指令标签

6.1 page指令

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

page指令常用属性

contentType 指定当前JSP页面的MIME类型和字符编码

errorPage 指定当JSP页面发生异常时需要转向的错误处理页面

import 导入要使用的Java类

info 定义JSP页面的描述信息

language 定义JSP页面所用的脚本语言,默认是Java

6.2 include指令

jsp通过include指令来包含其他文件,被包含的文件可以是jsp文件、HTML文件、文本文件等。

6.3 taglib指令

jsp api允许用户自定义标签。taglib指令可以引入一个自定义的标签库。

7 jsp动作元素

jsp动作元素是在请求处理阶段起作用,它是用xml语法写成的。

7.1 利用jsp动作元素可以完成如下操作:

1>动态的插入文件

2>重用javaBean组件

3>重定向展示页面

4>生成html代码

动作元素语法如下:

<jsp:action_name attribute="value" />

常用的动作元素如下

jsp:include 引入文件

jsp:useBean 实例化一个javaBean

jsp:setProperty 设置某个javaBean属性

jsp:getProperty 输出某个javaBean属性

jsp:forward 将请求转入另一个新的页面

jsp:element 定义动态的xml元素

jsp:attribute 设置xml元素属性

jsp:body 设置xml元素内容

jsp:text 在jsp页面中写入文本模板

常见的属性如下

所有的动作元素都要有两个属性:id属性和scope属性

id属性:动作元素的唯一标识

scope属性:标识动作元素的生命周期

jsp:include示例如下

在工程中定义date.jsp文件,如下

<p> Today's date: <%= (new java.util.Date()).toLocaleString()%></p>

在MyJsp.jsp中调用上述文件,注意date.jsp和MyJsp.jsp文件均放在服务器的根目录下,在可以这样直接引用。

<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

<body> This is my JSP page. <br>

<jsp:include page="date.jsp" flush="true" />

</body> </html>

运行出的效果如下

8 jsp隐式对象

jsp隐式对象是jsp容器为每个页面提供的java对象,开发者可以直接使用它(即不需要声明)。

常见jsp支持的隐式对象

对象 描述

request httpServletRequest类的实例对象

response httpServletResponse类的实例对象

session httpSession类的实例对象

application ServletContext类的实例对象,与应用上下文有关

config ServletConfig类的实例对象

常用对象描述

8.1.request对象

它是javax.servlet.http.HttpServletRequest 类的实例,每当客户端有一次http请求时,web容器会实例化一个request对象来代表这个请求。

request对象提供了一系列方法来获取http头部信息。

8.2.response对象

它是javax.servlet.http.HttpServletResponse类的实例,当服务器创建request对象时,同时会产生响应这个客户端的response对象。

8.3.session对象

它用来跟踪客户端请求过来的会话。

8.4.application对象

它是javax.servlet.ServletContext 类的实例,它在jsp页面初始化时被创建,随着jspDestroy()方法法的调用被移除。

9 jsp客户端请求

当浏览器请求一个网页时,它会向服务器发送许多头部消息,常见的头部消息如下:

头部消息 描述

Accept-Charset 指定浏览器使用的字符集,例如ISO-8859-1

Accept-Encoding 指定编码类型

Accept-Language 指定客户端语言

Authorization 在访问受密码保护的网页时识别不同的用户

Connection 表明客户端是否可以处理HTTP持久连接。持久连接允许客户端或浏览器在一个请求中获取多个 文件。Keep-Alive 表示启用持久连接

Content-Length 仅适用于POST请求,表示 POST 数据的字节数

Cookie 返回先前发送给浏览器的cookies至服务器

Host 指出原始URL中的主机名和端口号

User-Agent 用来区分不同浏览器或客户端发送的请求,并对不同类型的浏览器返回不同的内容

10 jsp服务器响应

response响应主要是将jsp容器处理后的结果返回给客户端,可以通过response变量设置http的状态和向客户端发送数据。

状态行包含HTTP版本信息(如:HTTP/1.1)、状态码(如:200)、状态码信息(如:OK)。常见头部信息如下:

响应头 描述

Connection 浏览器是否要使用持久的HTTP连接。close值 命令浏览器不使用持久HTTP连接,而keep-alive 意味着使用持久化连接。

Content-Encoding 指定传输时页面的编码规则

Content-Language 表述文档所使用的语言

Content-Length 表明响应的字节数。只有在浏览器使用持久化 (keep-alive) HTTP 连接时才有用

Content-Type 表明类容类型,例如:application/json;charset=utf-8

11 JSP表单处理

11.1 读取表单数据

getParameter() 该方法可以获取单个表单参数的值

getParameterValues() 接收数组变量(即名字一样,值有多个),例如:checkbox类型

getParameterNames() 该方法可以获取所有变量的名称,该方法返回类型是Emumeration

getInputStream() 获取来自客户端的二进制数据流

示例如下:

1.MyJsp.jsp文件如下,即 接收文件

<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

<body> This is my JSP page. <br>

<jsp:include page="date.jsp" flush="true" />

<p>
    one parameter:<%= request.getParameter("one")%>
</p>
<p>
    two parameter:<%= request.getParameter("two")%>
</p>

</body> </html>

2.使用URL的GET方法实例

http://localhost:8080/wxm_cms/MyJsp.jsp?one=lixianl&two=29

3.运行效果如下

4.使用表单的GET方法实例

4.1 首先写一个html文件,命名为ceshi.html,类容如下

<html> <body> <form action="MyJsp.jsp" method="GET"> one: <input type="text" name="one"> <br /> two: <input type="text" name="two" /> <input type="submit" value="Submit" /> </form> </body> </html>

4.2 将MyJsp.jsp文件与ceshi.html文件都放在<tomcat安装目录>/webapps/ROOT目录下,我的目录如下

D:\tomcat7\apache-tomcat-7.0.63\webapps\ROOT

4.3 启动tomcat

4.4 在浏览器输入

http://localhost:8080/ceshi.html

出现如下页面

在输入框里输入 lxl 30,点击submit,出现如下界面,注意查看地址栏参数

5.使用表单的POST方法实例

5.1 只需要修改ceshi.html文件,修改form的提交方式为POST,文件如下

<html> <body> <form action="MyJsp.jsp" method="POST"> one: <input type="text" name="one"> <br /> two: <input type="text" name="two" /> <input type="submit" value="Submit" /> </form> </body> </html>

5.2 测试方法同 4一样

6 传递checkbox数据到jsp程序

复选框checkbox可以传递一个或多个数据,修改ceshi.html代码如下

<html> <body> <form action="MyJsp.jsp" method="POST" target="_blank"> <input type="checkbox" name="A" /> A <input type="checkbox" name="B" /> B <input type="checkbox" name="C" /> C <input type="checkbox" name="D" /> D <input type="submit" value="Submit" /> </form> </body> </html>

修改MyJsp.jsp代码如下

<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

<body> This is my JSP page. <br>

<jsp:include page="date.jsp" flush="true" />

<p>
    one:<%= request.getParameter("A")%>
</p>
<p>
    two:<%= request.getParameter("B")%>
</p>
<p>
    three:<%= request.getParameter("C")%>
</p>
<p>
    four:<%= request.getParameter("D")%>
</p>

</body> </html>

我点击B、C两项,截图如下

运行结果如下

12 jsp过滤器

jsp过滤器实际上是一个java类,它的作用

1.前台访问后端时,拦截一些非法的访问

2.前台访问成功,根据权限(或其他条件)返回给客户端部分信息

过滤器一般设置在web.xml文件中,然后映射servlet、jsp文件的名字。我做过的项目一个实例

过滤字符编码格式 utf-8,

如果需要多重过滤,则只需要顺序的写上过滤条件即可。

<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">

<filter>  
    <filter-name>CharacterEncodingFilter</filter-name>  
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>  
    <init-param>  
        <param-name>encoding</param-name>  
        <param-value>UTF-8</param-value>  
    </init-param>
    <init-param>
        <param-name>forceEncoding</param-name>
        <param-value>true</param-value>
    </init-param>  
</filter>  

<filter-mapping>  
    <filter-name>CharacterEncodingFilter</filter-name>  
    <url-pattern>/*</url-pattern>  
</filter-mapping>  

<servlet>
    <servlet-name>pets</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>pets</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>     

<context-param>
    <param-name>webAppRootKey</param-name>
    <param-value>pets.root</param-value>
</context-param>

<!-- Log4j 配置 -->
<context-param>
    <param-name>log4jRefreshInterval</param-name>
    <param-value>10000</param-value>
</context-param>
<listener>
    <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>

</web-app>

  1. JSP Cookies处理

13.1 Cookies一般用于安全系验证,服务器通常采用如下方式来识别 再次访问的客户端

1>客户端第一次请求服务器时,服务器返回一系列cookies给客户端

2>客户端将返回的cookies信息保存在本地

3>客户端再次访问服务器时,需要将cookies信息一起发送给服务器,服务器通过这些cookies信息来识别该客户端是不是上次访问的客户端。

13.2 cookies解析

cookies信息通常设置在http请求的头部中。

设置cookie一般是三个步骤

1>创建一个cookies对象

Cookie cookie = new Cookie("key","value");

2>设置有效期

cookie.setMaxAge(602424);

3>将cookie添加到http响应头中

response.addCookie(cookie);

14 jsp 页面重定向

当我们需要从一个页面跳往另外一个页面时,就需要用到jsp的重定向了。

重定向有两种方法

方法1

使用response.sendRedirect()

示例如下

<%@ page import="java.io.,java.util., javax.servlet.*" %>

<html> <head> <title>test direction</title> </head> <body>

<% //方法1:使用response.sendRedirect();方法 response.sendRedirect("http://www.qq.com/"); %>

</body> </html>

方法2

我们通常使用setStatus()和setHeader()方法来实现重定向。

<%@ page import="java.io.,java.util., javax.servlet.*" %>

<html> <head> <title>test direction</title> </head> <body>

<!-- <% //方法2:使用response.setStatus()和response.setHeader()方法 String site = new String("http://www.baidu.com"); response.setStatus(response.SC_MOVED_TEMPORARILY); response.setHeader("Location",site); %> -->

<!-- <% //方法2:使用response.setStatus()和response.setHeader()方法 response.setStatus(response.SC_MOVED_TEMPORARILY); response.setHeader("Location","index.jsp"); %> -->

</body> </html>

15 jsp点击量统计

用途:记录某个页面被访问的次数

实现:可以利用getAttribute()和setAttribute()方法来实现

实例

<%@ page import="java.util.*" %>

<html> <head> <title>Applcation object in JSP</title> </head> <body>

<% Integer hitCounts = (Integer)Applcation.getAttribute("hit");

  if(hitCounts == null || hitCounts == 0)
  {

     out.println("首次访问");
     hitsCount = 1;
  }else
  {
      out.println("再次访问");
      hitsCount += 1;
  }

  //设值
  application.setAttribute("hit", hitCounts);

%>

</body> </html>

转载于:https://my.oschina.net/u/2312022/blog/1619877

相关文章:

  • js 拾遗之return
  • Linux颜色文件+tab+快捷键
  • [HNOI2010]BUS 公交线路
  • 瀑布开发和敏捷开发
  • 静态链表
  • SDUT OJ 数据结构实验之链表六:有序链表的建立
  • webpack-loader
  • 算法学习之路|搬运家具(模拟)
  • Java电商项目面试题(五)
  • 流媒体之HLS——综述
  • 人工智能三年行动计划启动,推动人工智能和实体经济深度融合
  • MySQL数据库----IDE工具介绍及数据备份
  • 阿里云CodePipeline亮相,帮助用户实现持续集成与交付
  • 使用Photoshop+960 Grid System模板进行网页设计
  • div层次整理 / 自定义pycharm补全 / 注释 /keymap /tab
  • 《Java8实战》-第四章读书笔记(引入流Stream)
  • 【node学习】协程
  • CentOS学习笔记 - 12. Nginx搭建Centos7.5远程repo
  • Codepen 每日精选(2018-3-25)
  • CSS居中完全指南——构建CSS居中决策树
  • es6(二):字符串的扩展
  • hadoop集群管理系统搭建规划说明
  • iOS | NSProxy
  • Java,console输出实时的转向GUI textbox
  • JavaScript创建对象的四种方式
  • Linux快速复制或删除大量小文件
  • magento2项目上线注意事项
  • Median of Two Sorted Arrays
  • php的插入排序,通过双层for循环
  • RxJS: 简单入门
  • SegmentFault 技术周刊 Vol.27 - Git 学习宝典:程序员走江湖必备
  • SOFAMosn配置模型
  • VUE es6技巧写法(持续更新中~~~)
  • 闭包--闭包作用之保存(一)
  • 发布国内首个无服务器容器服务,运维效率从未如此高效
  • 分享几个不错的工具
  • 技术:超级实用的电脑小技巧
  • 开源地图数据可视化库——mapnik
  • 前言-如何学习区块链
  • 如何优雅的使用vue+Dcloud(Hbuild)开发混合app
  • 阿里云API、SDK和CLI应用实践方案
  • ​插件化DPI在商用WIFI中的价值
  • #100天计划# 2013年9月29日
  • #HarmonyOS:软件安装window和mac预览Hello World
  • #Js篇:单线程模式同步任务异步任务任务队列事件循环setTimeout() setInterval()
  • #stm32驱动外设模块总结w5500模块
  • #中的引用型是什么意识_Java中四种引用有什么区别以及应用场景
  • $$$$GB2312-80区位编码表$$$$
  • (Matlab)遗传算法优化的BP神经网络实现回归预测
  • (MIT博士)林达华老师-概率模型与计算机视觉”
  • (第二周)效能测试
  • (分布式缓存)Redis持久化
  • (六)vue-router+UI组件库
  • (数位dp) 算法竞赛入门到进阶 书本题集
  • (五)关系数据库标准语言SQL