我与JSP的故事

大家好,今天为大家带来一款后台语言JSP,作为前端的我,当然是有一些学习成本在里面。今天就做jsp的简单的语法和jsp是什么,用来干什么,怎么用。怎么用这语言沟通。就是此次分享的内容。 为什么我会去接触jsp呢,首先一点呢是公司的业务需求,让我去了解去学习jsp。咱这次项目后台是jsp做的。闲话不扯了。开始咱们的正题吧

  • jsp首先是运行在服务端的语言,跟java,php,.net差不多。
  • jsp全称(java server pages)是由 Sun Microsystems 公司倡导和许多公司参与共同创建的一种使软件开发者可以响应客户端请求,而动态生成 HTML、XML 或其他格式文档的Web网页的技术标准。
  • jsp是以java作为脚本语言的
  • jsp是以.jsp结尾的
  • jsp开发的web应用可以跨平台
  • 标签通常以<%开头以%>结束

一直再提tomcat,tomcat到底是什么? Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。由于有了Sun 的参与和支持,最新的Servlet 和JSP 规范总是能在Tomcat 中得到体现,Tomcat 5支持最新的Servlet 2.4 和JSP 2.0 规范。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为比较流行的Web 应用服务器。 tomcat下载地址 tomcat.apache.org/

tomcat

//8086 改port端口号

出现这个你就成功啦

JavaWeb开发入门需要学哪些?看完你就懂了

目前,国内外信息化建设已经进入基于Web应用为核心的阶段,Java作为应用于网络的最好语言,前景无限看好。然而,就算用Java建造一个不是很烦琐的web应用,也不是件轻松的事情。那么,本文章就来详细说说JavaWeb需要掌握的技术!

首先Java基础语法是基础,另外大家对于MySQL、JDBC、HTML和CSS、JavaScript、BootStrap、XML、Tomcat、Servlet和HTTP请求协议、Request和Response、Cookie和Session、JSP,EL和JSTL等等知识必须要熟练掌握,这样才能基本具备JavaWeb开发能力。

现在我来讲讲JavaWeb开发的具体知识。Java基础语法包括了多个模块。基础语法内容有JDK和Path环境变量、常量变量&数据类型、运算符、选择结构-if语句- switch语句、循环结构-for-while-do…while、开发工具-IDEA、数组、方法、 方法重载&方法参数,还有面向对象、常用API、多线程&网络编程、异常&集合、JDK新特性和反射与模块化等等知识点的学习,都能为后续JavaWeb的学习打下坚实基础。

而进入JavaWeb的学习阶段,内容就比较复杂了,需要掌握的知识点更多。我列了一个学习大纲,大家可以参考着规划自己的学习计划。

数据库概念、MySQL安装与使用、SQL基本概念与通用语法、数据库的CRUD操作、数据库表的CRUD操作、数据库表中记录的基本操作、 数据库的查询操作、表的约束、多表操作、三大范式、数据库的备份和还原、多表查询、子查询、多表查询练习、事务、用户管理和权限管理

JDBC快速入门、JDBC各个类详解、JDBC之CRUD练习、ResultSet类详解、JDBC登录案例、PreparedStatement类详解、JDBC事务管理、数据库连接池、JDBCTemplate

概念、基本标签、表单标签、CSS概述、CSS_选择器、CSS属性、CSS_案例

JavaScript_简介、JavaScript基础语法、JavaScript运算符、JavaScript特殊语法、JavaScript_语法_流程控制语、JavaScript_对象 、DOM和事件的简单学习、BOM对象、DOM对象、JavaScirpt中的事件

快速入门、Bootstrap_栅格系统、Bootstrap_全局CSS样式、Bootstrap_组件和插件、案例_黑马旅游网

xml基础、xml_约束、xml_解析

web相关概念、tomcat基本操作、tomcat_部署项目

Servlet_快速入门、Servlet_生命周期方法、Servlet_3.0注解配置、IDEA与tomcat相关配置、Servlet_体系结构与urlpartten配置、HTTP请求协议

Request原理和继承体系、Request_获取请求数据、请求转发和request共享数据、Request_获取ServletContext、request登录案例、HTTP响应协议、response之重定向 、response之相对路径和绝对路径、response之输出数据、response之验证码、ServletContext对象、文件下载

Cookie快速入门、Cookie_细节、Cookie案例、JSP改造Cookie案例、Session快速入门、Session细节、Session之验证码案例

JSP基础语法、MVC、EL介绍和运算符、EL获取域中存储的数据、JSTL常用标签、案例-列表查询

登录功能、添加删除修改功能、删除选中功能、分页查询功能、复杂条件查询功能

Filter快速入门、Filter细节、Filter案例、监听器

JQuery基础、JQuery选择器、JQuery基础案例、JQuery动画和遍历、JQuery事件绑定和切换、JQuery高级案例

原生JS方式实现Ajax、JQuery方式实现Ajax、JSON基础语法、JSON_解析器

Redis环境搭建、Redis命令操作、Redis持久化、Jedis代码操作、Jedis连接池、redis案例

基本概念、maven的安装和仓库种类、maven标准目录结构和常用命令、maven生命周期和概念模型图、使用骨架创建maven的java工程、maven工程servlet实例

Linux介绍&软件安装、Linux的常用命令、Linux环境部署、Nginx

以上就是我总结的想要具备JavaWeb开发能力需要掌握的知识。希望看了本文后对初学者们学习Java开发有所帮助!总而言之,如果仅仅想通过自学来掌握以上内容,难度还是不小的,因此建议大家最好系统去学习,这样的学习效果和效率都会最大化。

JSP的基本使用总结

  1. JSP的全称是Java Server Pages,即Java的服务器页面
  2. JSP的主要作用是代替Servlet程序回传HTML页面的数据
  3. web目录(或其他)右击 –> new –> JSP/JSPX –> 输入文件名 –> 选择JSP file创建

JSP页面本质上是一个Servlet程序,第一次访问JSP页面时(运行Tomcat服务器后在浏览器地址栏输入路径),Tomcat服务器会将此JSP页面翻译成为一个Java源文件,并对其进行编译成为.class字节码文件(一个.java,一个.class),当打开.java文件时发现其中的内容是:

而HttpJspBase类直接继承于HttpServlet类,即JSP翻译出来的Java类间接继承于HttpServlet类,证明JSP页面是一个Servlet程序

JSP头部的page指令:

JSP头部的page指令可以修改JSP页面中的一些重要属性或行为

(以下属性均写在page指令中,默认page指令中没有出现的属性都采用默认值):

(1) contentType属性:表示JSP返回的数据类型是什么,即response.setContentType()的参数值

(2) language属性:表示JSP翻译之后是什么语言文件(目前只支持Java)

(3) pageEncoding属性:表示当前JSP文件本身的字符集(可在IDEA右下角看到)

(4) import属性:表示导包(导类),与Java一致

(5) autoFlush属性:设置当out输出流缓冲区满了之后是否自动刷新缓冲区,默认值是true

(6) buffer属性:设置out缓冲区的大小,默认是8kb

注意:out缓冲区满了之后不能自动刷新的话会报错

(7) errorPage属性:设置当JSP页面运行出错时自动跳转到的页面(错误信息页面)的路径,这个 路径一般都是以斜杠打头,表示请求的地址是http://ip:port/工程路径/,对应代码web目录

(8) isErrorPage属性:设置当前JSP页面是否是错误信息页面,默认是false,如果是true可以 获取错误信息

(9) session属性:设置访问当前JSP页面时是否会创建HttpSession对象,默认值是true

(10) extends属性:设置JSP页面翻译出来的Java类默认继承谁

注意:以上默认值除非有特殊需要,否则不建议修改

格式:<%! 声明Java代码 %>

作用:可以给JSP翻译出来的Java类定义属性、方法、静态代码块、内部类等

特点:不会在浏览器的页面上显示出来,仅存在于翻译后的Java类中

代码演示:声明脚本的使用(此JSP文件在web目录下,名为First.jsp)

%@ page contentType=\”text/html;charset=UTF-8\” language=\”java\” %>

<%@ page import=\”java.util.HashMap\” %>

<%@ page import=\”java.util.Map\” %>

<html>

<head>

<title>Title</title>

</head>

<body>

<%–1.声明类属性–%>

<%!

private String name;

private static Map<String, Object> map;

%>

<%–2.声明类方法–%>

<%!

public int sum() {

return 12;

}

%>

<%–3.声明静态代码块–%>

<%!

static {

map = new HashMap<String, Object>();

map.put(\”key1\”, \”value1\”);

}

%>

</body>

</html>

对应的翻译后的java源文件:

格式:<%=表达式 %>

作用:在浏览器的JSP页面上输出数据(只有此脚本可以在浏览器的页面上输出数据)

特点:

(1) 所有的表达式脚本都会被翻译到对应的Java类的_jspService()方法中,故表达式脚本可以 直接使用_jspService()方法参数中的对象

(2) 表达式脚本都会被编译后的Java类中的out.print()方法输出到浏览器页面上

(3) 表达式脚本中的表达式不能以分号结束

代码演示:表达式脚本的使用(此JSP文件在web目录下,名为First.jsp)

<%=22 %> <br/>

<%=\”可以输出字符串\” %> <br/>

<%=map %> <br/>

<%–使用_jspService方法中的对象–%>

<%=request.getParameter(\”username\”) %>

启动Tomcat服务器后浏览器的运行结果:

对应的翻译后的Java源文件(在_jspService方法中):

注意:

1.write方法中的标签、转义字符自动识别为对应的

功能,不在页面输出,执行各自代表的功能

2.out的两个方法也在_jspService方法中,也都是java语言

3.只有print、write方法、表达式脚本中的内容才可在浏览器中显示,其余Java代码的sout在控制台输出

格式:<% Java语句 %>

作用:在JSP页面中可以编写需要的Java代码

特点:

(1) 代码脚本翻译后都在_jspService方法中,故代码脚本可以直接使用此方法参数中的对象

(2) 可以由多个代码脚本块组合完成一个完整的Java语句

(3) 代码脚本还可以和表达式脚本一起组合使用,在JSP页面上输出数据

代码演示:代码脚本的使用(此JSP文件在web目录下,名为First.jsp)

<%–1.if语句–%>

<%

int i = 1;

if (i == 1) {

System.out.println(\”我爱祖国!\”);

} else {

System.out.println(\”我很爱祖国!\”);

}

%> <br/>

<%–2.for循环语句–%>

<%

for (int j = 0 ; j < 3; j++) {

System.out.println(\”第\” + j + \”次循环\”);

}

%> <br/>

<%–3.使用_jspService方法参数中的对象–%>

<%

String username = request.getParameter(\”username\”);

System.out.println(\”username对应的值为:\” + username);

%>

运行结果:

启动Tomcat服务器后在地址栏输入:http://localhost:8080/MyTest/First.jsp?username=Jaychou

在控制台显示:

对应的翻译后的Java源文件(在_jspService方法中):

1.HTML注释:<!–HTML注释–>

HTML注释会被翻译到JSP文件对应的Java类的_jspService方法中,以out.write()输出到客户端,

write方法会自动识别标签,执行标签对应的功能,不会在浏览器的页面上输出注释

2.Java注释:(1) //单行注释 (2) /*多行注释*/

Java注释要写在声明脚本和代码脚本中才被认为是Java注释,会被翻译到JSP文件对应的Java类的_jspService方法中,在对应的Java类中也是注释

3.JSP注释:<%- -这是JSP注释- -%>

JSP注释中的内容不会在JSP文件翻译后的Java类中出现,即注释中的内容没有任何功能

JSP的内置对象指的是Tomcat服务器将JSP页面翻译为Java类之后内部提供的九大对象:

(将page指令的isErrorPage属性写成true可以出现exception对象)

request:请求对象

response:响应对象

pageContext:JSP的上下文对象

session:会话对象

application:ServletContext对象

config:ServletConfig对象

out:JSP输出流对象

page:指向当前JSP的对象

exception:异常对象

域对象是指可以像Map一样存取数据的对象,四个域对象功能一样,只是对数据的存取范围不同

代码演示1:四个域对象存取数据的范围的不同(在web目录下创建scope1.jsp)

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

<html>

<head>

<title>scope1</title>

</head>

<body>

<h1>scope1.jsp页面</h1>

<%

//向四个域对象中分别保存数据

pageContext.setAttribute(\”key\”, \”pageContext\”);

request.setAttribute(\”key\”, \”request\”);

session.setAttribute(\”key\”, \”session\”);

application.setAttribute(\”key\”, \”application\”);

%>

<%– <jsp:forward page=\”\”></jsp:forward>是请求转发标签,

page属性设置请求转发的路径 –%>

<jsp:forward page=\”/scope2.jsp\”></jsp:forward>

</body>

代码演示2:在web目录下创建scope2.jsp

<head>

<title>Title</title>

</head>

<body>

<h1>scope2.jsp页面</h1>

<%– JSP页面中不加任何标签直接输入的内容被write方法输出在浏览器的页面上 –%>

pageContext域是否有值:<%=pageContext.getAttribute(\”key\”)%> <br>

request域是否有值:<%=request.getAttribute(\”key\”)%> <br>

session域是否有值:<%=session.getAttribute(\”key\”)%> <br>

application域是否有值:<%=application.getAttribute(\”key\”)%> <br>

</body>

运行结果1:

运行结果2:

注意:若四个域对象在使用时范围都可满足要求,则使用的优先顺序是(范围从小到大):

pageContext –> request –> session –> application

1.相同点:response表示响应,用于给客户端(浏览器)返回内容

out同样也是用于给客户端(浏览器)输出内容

2.不同点:

3.注意:由于官方的代码中翻译后的Java代码底层都是使用out进行输出,故一般都使用out进行 输出,out又分为write方法和print方法:

(1) out.print():会将任何内容转换成字符串后调用write方法输出

(2) out.write():输出字符串没有问题,但输出int型时会将int转换成char输出,导致输出的并非是想要的数字而是数字对应的ASCII码

结论:JSP页面的代码脚本中任何要输出在浏览器的内容均使用out.print()方法

(1)使用场景:

(2)使用方法:

<%@include file=\”\”%>

其中file属性设置要包含的JSP页面,以/打头,代表http://ip:port/工程路径/,对应web目录

代码演示1:在web目录下创建body.jsp

<body>

头部信息 <br>

主体信息 <br>

<%@include file=\”/foot.jsp\”%>

</body>

代码演示2:在web目录下创建foot.jsp

<body>

页脚信息 <br>

</body>

运行结果:

(3)静态包含的特点:

①静态包含不会将被包含的JSP页面翻译成.java.class文件

②静态包含是把被包含的页面的代码拷贝到body.jsp对应的Java文件的对应位置执行输出

(1)使用方法:

<jsp:include page=””></jsp:include>

其中page属性设置要包含的JSP页面,与静态包含一致

(2)动态包含的特点:

①动态包含将被包含的JSP页面翻译成.java.class文件

②动态包含还可以传递参数

③动态包含底层使用如下代码调用被包含的JSP页面执行输出:

org.apache.jasper.runtime.JspRuntimeLibrary.include(request, response, “/foot.jsp”, out, false);

代码演示1:在web目录下创建body.jsp

<body>

头部信息 <br>

主体信息 <br>

<jsp:include page=\”/foot.jsp\”>

<jsp:param name=\”username\” value=\”Jaychou\”/>

<jsp:param name=\”password\” value=\”root\”/>

</jsp:include>

</body>

注意:

  1. 设置参数的标签要写在动态包含之中
  2. 出现Expecting “jsp:param” standard action with “name” and “value” attributes异常,两个原因:

①动态包含中未设置参数但没有把<jsp:include page=””></jsp:include>放在一行上

②动态包含中加了注释

代码演示2:在web目录下创建foot.jsp

<body>

页脚信息 <br>

<%=request.getParameter(\”username\”)%>

</body>

运行结果:

(3)动态包含的底层原理:

(1) Listener监听器是JavaWeb的三大组件之一

(2) Listener监听器是JavaEE的规范(接口)

(3) Listener监听器的作用是监听某件事物的变化,然后通过回调函数反馈给程序做一些处理

ServletContextListener监听器可以监听ServletContext对象的创建和销毁(web工程启动时创建,停止时销毁),监听到创建和销毁之后都会调用ServletContextListener监听器的方法进行反馈:

public interface ServletContextListener extends EventListener {

//在ServletContext对象创建之后调用

public void contextInitialized(ServletContextEvent sce);

//在ServletContext对象销毁之后调用

public void contextDestroyed(ServletContextEvent sce);

}

(1) 编写一个类实现ServletContextListener接口

(2) 重写两个方法

(3) 在web.xml文件中配置监听器

代码演示1:创建一个类

ublic class ListenerTest implements ServletContextListener {

@Override

public void contextInitialized(ServletContextEvent servletContextEvent) {

System.out.println(\”ServletContext对象创建\”);

}

@Override

public void contextDestroyed(ServletContextEvent servletContextEvent) {

System.out.println(\”ServletContext对象销毁\”);

}

}

代码演示2:在web.xml中配置

<listener>

<!– <listener-class>标签中写上述程序的全类名 –>

<listener-class>com.qizegao.servlet.ListenerTest</listener-class>

</listener>

运行结果:

Tomcat服务器启动之后控制台输出ServletContext对象创建

Tomcat服务器停止之后控制台输出ServletContext对象销毁

注意:

  1. 查看翻译后的Java源文件的方法:启动Tomcat服务器访问到JSP页面之后在控制台输出的信息的前端找到Using CATALINA_BASE中的路径,在硬盘中打开此目录,点击work –> Catalina –> localhost,找到对应的工程文件夹寻找即可
  2. 访问JSP页面其实是在执行对应的翻译后的Java代码的_jspService方法:翻译后的Java类中没有service方法,而是重写了父类的_jspService方法,这个方法会被父类的service方法调用

[机智]

本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com

点赞 0
收藏 0

文章为作者独立观点不代本网立场,未经允许不得转载。