动态页面:是指网页内容随着用户或计算机程序提供的参数变化而变化的HTML。是实时生成的。
HTML、CSS、JS都是静态页面,而JSP、servlet是动态页面,可以实现验证用户名是否存在、用户名与密码是否匹配的功能。
Java Web是用Java技术来解决相关web互联网领域的技术总称。
需要再特定的web服务器上运行,分为web服务器和web客户端两部分。
跨平台,能够再多个不同平台下部署运行。
需要会那些技术
基于页面的前端技术,如HTML、CSS、JavaScript等。
动态语言技术,如Java、JSP等。( JSP是Java API家族中的一部分。)
数据库的技术,如Oracle、MySQL、SQL server等。
其他工具与组件,如服务器、SSM、SSH框架等。
Java Web应用场景一:淘宝
2004年,淘宝PHP语言转换为Java语言。
Java Web应用场景二:12306
1、高并发 2、数据量大 3、软件与硬件成本高
还有亚马逊、携程都采用javaweb
JSP简介
JSP全名为Java server Pages,中文名叫Java服务器页面,其根本是是要给简化的servlet设计。
JSP是在传统的网页HTML文件中插入Java程序段(Scriptlet)和JSP标记(tag),从而形成JSP文件,后缀名为(*.jsp)。
另:JSP允许扩展JSP标签(后面的课程中会介绍)
第一个JSP程序
完整的JSP程序
JSP程序的执行过程
JSP程序声明周期
注意:如果此处不配置target runtime(即指定tomcat服务器),则需要查看教辅——《第一个JSP程序—需要导入servlet-api.jar》,按教辅新建并运行项目。
动态项目的结构
Java Resources 包含项目的Java源代码
WebContent 所有Web资源(包括HTML、JSP、和图形文件等等)的指定位置。
WEB-INF 对于Web应用程序,此目录包含支持的Web资源,包含web.xml文件以及classes和lib目录。
/classes:Java编译器产生的类文件输出目录。应用程序类载入器使用此目录中的类来转载运行时所需要的功能。
/lib:包含Web应用程序所引用的支持性JAR文件,是综合的资源文件目录。
web.xml:标准Web应用程序部署描述符。是一个项目核心配置文件。
JSP程序的执行过程
|———请求—>——JSP页面文件(.jsp文件)
客户端(Web浏览器)| Servlet代码(Java文件)
| 编译后的字节码(.class文件)
|——<—响应———字节码程序处理客户请求
注:在调试JSP的时候,如果程序出错,JSP服务器会返回出错信息,并在浏览器显示,
这时由于JSP是先被转换成.java文件(Servlet)后再运行的,所以,浏览器中显示的代
码出错的行数并不是JSP源代码的行数,而是指转换后的.java文件(Servlet)中程序代码的行数。
JSP基本语法
一、JSP声明语法
二、JSP程序脚本
三、JSP脚本注释
四、JSP内容输出表达式
五、包引入语法
一、JSP声明语法 ( <%! %>和<% %> 可以出现多次。)
语法格式: <%! String str= "hello world"; %>
定义成员变量,以及成员方法
不能直接包含程序语句
<body>
<%! String str="hello world"; String getStr(){return "hello world2";} %> 定义成员变量、成员方法
<hr>
<% out.println(this.str); %> JSP的脚本
<hr>
<%=this.getStr() %> JSP的内容输出表达式,输出的变量名称不需要带分号;
</body>
另——以下为交叉式的JSP写法 ( <%! %>和<% %> 可以出现多次。)
<%! if(i>10) { %>
<span> i>10 </span> 出现与HTML的标签交替式设计。
<%! } %>
另——区别 关于 全局变量 和 局部变量
<%! int totalCount=0; %> //全局变量 用<%! %>
<% int localCount=0; //局部变量 (脚本变量) <% %>
totalCount ++;
localCount ++;
%>
<% out.println(totalCount); //成员变量,每次刷新访问都会运行导致+1,
out.println("<br>");
out.println(localCount); //局部变量,每次刷新都会重置。
%>
二、JSP程序脚本 //脚本变量、代码块的声明,用 <% %>
包括变量的声明、表达式和程序逻辑
声明的变量为_service方法中的变量,因而是局部变量
语句块可以自由地与页面代码组合使用
<% int i=100; %>
<% if(i>10){ %>
<h1>这里是页面文本:i<10 </h1> //不必直接写out.println("i<10");
<% }else{ %>
<h1>这里是页面文本:i<=10 </h1>
<% } %>
JSP页面的基本结构 ------来自《JSP动态网站项目化教程》郑铁的2013年书。。
1、HTML标记:用来创建用户界面,实现数据的输入和展示。
2、注释:包括HTML注释、JSP注释和脚本注释 <%-- --%>既可以用来注释JSP脚本代码,又可以注释JSP代码。
3、声明变量、方法和对象,在“<%!”和“ %>”之间声明
4、表达式(),在“<%= ”和“ %>”之间定义
5、Java代码块(),在标记“<%”和“ %>”之间定义。用来实现逻辑运算
6、JSP标记:用来控制页面属性。它包括 指令(Directive)标记,在“<%@”和“%>”之间定义;
动作(Action)标记,在“<jsp: ”和“>”之间定义; 和自定义标记。
5、在JSP中,代码块的英文名称是Scriptlet。我们知道,在Java中,let指的是小应用程序,如applet指运行与客户端的小程序,Servlet指服务器的小程序,而Scriptlet指的是嵌套在JSP页面中的、使用Java语言编写的小程序。
可以在“<%”和“%>”标记符之间包含多个Java语句,构成Java代码块。
注:在<%!...%>之间定义的变量其作用范围均为全局的,而在<%...%>中定义的变量其作用范围均为局部的。
/★★注意:要特别说明的是:在<% %>代码块中,绝对不允许在其中定义方法,只能定义变量和写执行代码。
★★为什么会有这种情况呢?其实也很好理解,JSP为<% %>中的变量针对每个用户分配一块空间,而方法则是使用相同的内存空间,因此才不允许将方法写入此中。
Java代码块可以和页面的静态元素组合在一起生成动态页面。其主要功能如下:
(1)声明将要用到的变量(特别强调一下,在这里只能声明变量,不能声明方法)。
(2)编写JSP表达式。
(3)编写JSP语句,使用Java语言,必须遵从Java语言规范。
(4)使用任何隐含的对象和任何用<jsp:useBean>声明过的对象
(5)填写任何文本和HTML标记。
★★为什么会有这种情况呢?其实也很好理解,JSP为<% %>中的变量针对每个用户分配一块空间,而方法则是使用相同的内存空间,因此才不允许将方法写入此中。
书 4.2 JSP中的多线程同步 P59
当一个用户操作某个成员变量的时候,不允许其他用户操作同一个成员变量。
可以在操作成员变量的方法前加上关键字synchronized。 当A线程调用带关键字synchronized的方法时,如果B线程也要调用该方法,必须等到A线程结束,B线程才能调用,这样可以保证数据的一致性。
书 4.3 JSP中中文乱码的问题 P60
要想解决乱码问题,就要告诉浏览器我们到底使用了什么样的编码方法。具体方法有4种:
(1)指定浏览器编码方式。
可解决常量形式的中文乱码问题,但是仍然不能解决赋值形式的乱码问题,例如表单数据的提交等。
(2)在http的响应(response)中添加编码信息,使用如下方式:
<%@page contentType="text/html; charset=GBK"%> 或者
<%@page contentType="text/html; charset=gb2312"%>
//需要放在JSP页面的第一行,这样浏览器就可以从响应中获得编码格式了。
另外,还需要在HTML中指定一下编码格式:
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>title</title> //注:<meta>部分要放在head标签中的最前面,尤其是title标签中有中文的情况下。
</head>
(3)输入文字采用ISO-8859-1编码。
ISO-8859-1对ASC码进行了扩展,使用8位二进制表示一个字符,正好一个字节,数据库中一般用的也是ISO-8859-1字符集存储数据,Java程序在处理字符时默认采用统一的(体现Java国际化思想)
<% String str=request.getParameter("");
byte a[]=stat.getBytes(“ISO-8859-1”); //输入文字采用你ISO-8859-1编码
str=new String(a);
%>
(4)调用Request对象的色图Character Encoding方法。
该方法是比较常见的方式,其效果跟方法3相同,但使用较为方便。
但此方法必须在request.getParameter()方法前使用,即在该方法前编写如下语句:
<% request.setCharacterEncoding("GBK");%>
书4.4 JSP标记
1、JSP指令标记 以“<%@”开始,以“%>”结束。include和page指令是两个常用的JSP指令。
page指令用来定义整个JSP页面的各种属性。指令中,处理import属性外,每个属性只能定义一次。区分大小写。
include指令可以在JSP页面该指令出现的位置静态嵌入一个文件,包含的过程是静态的,包含的文件可以是JSP、HTML、文本或Java程序。
所谓静态包含是指用被插入的文件内容代替该指令标签,与当前JSP文件合并并生成新的JSP页面后,再由JSP引擎转译为Java文件。 <% include file="文件URL" %>
页面指令page –页面指令有以下几个选项:
import 使一个JAVA导入声明被插入到最终页面文件。
contentType 规定了生成内容的类型。当生成非HTML内容或者当前字符集character set并非默认字符集时使用。
errorPage 处理HTTP请求时,如果出现异常则显示该错误提示信息页面。
isErrorPage 如果设置为TRUE,则表示当前文件是一个错误提示页面。
isThreadSafe 表示最终生成的servlet是否安全线程(threadsafe)。
2、JSP动作标记
JSP动作 JSP动作是一系列可以调用内建于网络服务器中的功能的XML标签。JSP提供了以下动作:
jsp:include 和子过程类似,JAVA SERVLET暂时接管对其它指定的JSP页的请求和响应。当处理完该JSP页后就马上把控制权交还当前JSP页。这样JSP代码就可以在多个JSP页中共享而不用复制。
jsp:param 可以在jsp:include, jsp:forward或jsp:params块之间使用。指定一个将加入请求的当前参数组中的参数。
jsp:forward 用于处理对另一个JSP或SERVLET的请求和响应。控制权永远不会交还给当前JSP页。
jsp:plugin Netscape Navigator的老版本和Internet Explorer使用不同的标签以嵌入一个applet。这个动作产生为嵌入一个APPLET所需要的指定浏览器标签。
jsp:fallback 如果浏览器不支持APPLETS则会显示的内容。
jsp:getProperty 从指定的JavaBean中获取一个属性值。
jsp:setProperty 在指定的JavaBean中设置一个属性值。
jsp:useBean 创建或者复用一个JavaBean变量到JSP页。
1、param动作标签 该标签经常与jsp:include、jsp:forward、jsp:plugin一起使用,将param标签中的变量值传递给动态加载的文件。
2、include动作标签 该标签的作用是当前JSP页面动态包含一个文件,即将当前JSP页面、被包含的文件各自独立转译和编译为字节码文件。
当前JSP页面执行到该标签处时,才加载执行被包含文件的字节码。
(1)include 动作指令使用格式。include动作指令的语法格式如下:
<jsp:inilude page=" 文件的URL”flush="true|false"/> 或:
<jsp:include page="文件的URL”flush="true|false"/>
<jsp:param name="参数名1” value="参 数值1" />
<jsp:param name="参数名2” value="参数值2" />
</jsp:include>
注意:如果不使用param标记传递参致,要使用第一种格式,
如果需要传递参数,可以使用第二种格式,也可以使用第一种格式, 但是在“文件的URL"中要包含:?name=XXX的格式。
[例4-10利用jsp:incide指令和param动作指令传递数,求1-500的连续和,运行效果如图4-14所示,该示例包含程序ex4-10.jsp, ex4-10-1.jsp, 代码如下所示。
<!--ex4-10.jsp-->
<%@page contentType="text/html; charset=GB2312" >
<HTML>
<body bgcolor=Cyan >
<P>动态加载页面文件ex4-10-1.jsp,计算1-500的连续和
<jsp:include page="ex4-10-1.jsp">
<jsp:prarm name="computer" value="500"/>
</jsp:include>
</body></html>