JSP技术

JSP技术

JSP全名为Java Server Pages,中文名叫java服务器页面,其根本是一个简化的Servlet设计,它是由Sun Microsystems公司倡导、许多公司参与一起建立的一种动态网页技术标准,它实现了在HTML标签中使用Java代码

JSP是一种动态网页技术标准,也是JavaEE的标准。JSP和Servlet一样,是在服务器端执行的。JSP是在Servlet技术发展之后为了让开发者写html标签更方便而发展起来的技术,JSP实际上就是Servlet。但是通常把Servlet作为Web应用中的控制组件来使用,只负责响应请求产生数据,并把数据通过转发技术带给jsp,而把jsp技术作为数据显示模板来使用。这样使程序结构更清晰,可读性和可维护性更高。

Hello JSP

究其本质jsp页面就是包含Java代码的html网页

1、编写一个html网页

  • 执行访问不会在work文件夹下生成任何内容

2、将html后缀修改为.jsp

  • 自动在work下生成了两个文件,一个名为index_jsp.java,另外一个名为index_jsp.class
  • jsp并不能直接执行,需要先通过jsp引擎将jsp文件转换为servlet的类文件,然后通过Servlet引擎将servlet类文件编译为.class字节码文件,然后才能执行并生成html文档

3、可以在jsp文件中使用java语言编写相关的脚本程序

<table width="80%">
	<caption>99</caption>
	<%
	for(int i=1;i<10;i++){
	%>
	<tr>
		<%
			for(int k=1;k<=i;k++){
		%>
		<td><%=k%>*<%=i%>=<%=i*k%></td>
		<%}%>
	</tr>
	<%
		}
	%>
</table>

JSP基础语法

###注释

从软件工程化管理上说,不写注释是不合理的,一般建议编程中20%-30%左右的编码量为注释

JSP注释

<%-- 多行内容 --%> 会被编译器所忽略,其中可能有语法错误,但是不影响编译

html注释

<!--多行内容-->其中的内容会被编译执行,只是在浏览器中不进行显示

###模板元素

直接写在jsp页面的html内容称之为jsp页面的模板元素;模板元素在翻译过来的servlet中被out.write()原样输出到浏览器中

out.write("<table width=\"80%\">\r\n");
      out.write("\t<caption>99</caption>\r\n");
      out.write("\t");

	for(int i=1;i<10;i++){
	
      out.write("\r\n");
      out.write("\t<tr>\r\n");
      out.write("\t\t");

			for(int k=1;k<=i;k++){
		
      out.write("\r\n");
      out.write("\t\t<td>");
      out.print(k);
      out.write('*');
      out.print(i);
      out.write('=');
      out.print(i*k);
      out.write("</td>\r\n");
      out.write("\t\t");
}
      out.write("\r\n");
      out.write("\t</tr>\r\n");
      out.write("\t");

		}
	
      out.write("\r\n");
      out.write("</table>");

###JSP表达式 --取值

常量 : <%=“hello”%>

<% int k=100; %>
<%=k%>   转换的结果为out.write(k);
  • 不能定义合法的java代码,因为out.write()的原因
  • 不能定义方法,因为代码段中的内容会出现在public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
  • 可以通过匿名内部类的方式定义类
  • 注意:默认不能有;号

变量 :<%String name=“aa”;%> //定义变量

​ <%=name%> //取变量的值

  • <%%>之间应该是合法的java语句,允许定义多行程序
  • 不允许直接定义方法,不允许定义属性,可以定义临时变量,可以通过内部类的方式定义类【方法中允许定义类】
<%
	int res=0;
	for(int i=1;i<=100;i++)
		res+=i;
%>
<h3>1+2+3+...+100=<%=res%></h3>

对应编译的结果为

public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response) throws java.io.IOException, javax.servlet.ServletException {
    ... ...
    
        int res=0;
	for(int i=1;i<=100;i++)
		res+=i;

      out.write("\r\n");
      out.write("<h3>1+2+3+...+100=");
      out.print(res);
      out.write("</h3>");
    ....
}

代码段的编译结果会出现在_jspService方法内部

声明:

​ 语法规则: <%! 多行声明属性或者方法之类的内部成员 %>

<%! 
private int counter=0;
public void cc(){}
%>

编译生成的类定义

public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase
    implements org.apache.jasper.runtime.JspSourceDependent,
                 org.apache.jasper.runtime.JspSourceImports {

 
private int counter=0;
public void cc(){}
  • 允许定义方法或者属性以及内部类
  • 允许定义静态代码块或者非静态代码块
  • 不允许直接写执行语句,例如out.println(100);
  • 不能定义临时变量

需求:

页面计数器:统计当前页面的访问次数

默认Servlet的运行特征为单实例多线程的方式运行service方法,而jsp运行前需要编译为类,所以运行特征也应该是单实例多线程的方式运行_jspService方法

<%@ page contentType="text/html;charset=utf-8" %>
<%! private int counter=0; %>
您是第<%=++counter%>位访问者

因为_jspService是以多线程的方式运行,修改counter可能会导致安全问题

<%@ page contentType="text/html;charset=utf-8" %>
<%! private static int counter=0; 
	public synchronized void pp(){
			counter++;
	}
%>
<% pp(); %>
您是第<%=counter%>位访问者,IP地址为<%=request.getRemoteAddr()%>

###3大JSP页面指令

位置: 可以写在JSP页面的任意位置

格式:<%@ 指令名称 若干属性声明%>

  • 使用IDEA开发页面的默认存储位置为src/main/webapp/目录下,允许自定义目录

####page指令 --用来声明当前JSP页面的基本属性

<%@ page language="java" %> – 指定当前JSP使用的语言是java

####pageEncoding和contentType

<%@ page pageEncoding="UTF-8"%> – 用来通知JSP解析引擎使用指定的编码来翻译JSP

注意:如果想防止JSP乱码,应该要保证JSP文件保存时的编码和pageEncoding指定的编码保持一致

<%@ page contentType="text/html;charset=utf-8" %>类似于response.setContentType(“text/html;charset=utf-8”)

从语义上说两个属性不是一回事,但是经常会相互替代

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
当前页面的异常处理

<%@ page errorPage="bbc.jsp"%>如果在当前页面中出现异常自动跳转的页面

JSP中9大默认对象:exception

<%@ page isErrorPage=“true” %>表示在当前bbc.jsp页面中可以通过exception对象获取前面出现的异常

具体实现有异常的页面bbb.jsp

<%@ page contentType="text/html;charset=UTF-8" errorPage="bbc.jsp" language="java" %>
<% 
int k=0;
out.println(10/k);
%>

定义bbc.jsp页面用于显示bbb.jsp页面种出现的异常

  • 要求必须设置参数<%@ page contentType="text/html;charset=UTF-8" isErrorPage="true" language="java" %>,如果不配置isErrorPage则不能使用exception默认对象

  • 显示方式1: <%=exception%>

  • 显示方式2:<% exception.printStackTrace(); %>在控制台上显示报错信息

  • 显示方式3:在页面上显示调用栈

    <%
        exception.printStackTrace(new PrintWriter(out));
    %>
    
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值