javaWeb之JSP
一.JSP运行原理图
简单来讲,JSP =html+java片段+jsp标签+javascript,它功能强大,可以和javabean 结合
另外,JSP+javabeen+servlet 就构成了mvc模式。
JSP是运行在服务端的,也就是说,我们在桌面上创建一个.JSP文件,它也不能能够被执行哦。
jsp在处理时会自动编译为.class文件并保存在后端,在下次运行的时候就可以直接调用
二.JSP简单介绍
JSP(Java Server Pages)是由Sun Microsystems公司倡导,许多公司参与一起建立的一种动态网页技术标准。
JSP技术有点类似ASP技术,JSP技术是将Java程序段和JSP标记植入网页HTML文件中,从而形成JSP文件。
用JSP开发的Web应用是跨平台的,即能在Linux下运行,也能在其他操作系统上运行。
JSP技术使用Java编程语言编写类XML的tags和scriptlets,来封装产生动态网页的处理逻辑。
网页还能通过tags和scriptlets访问存在于服务端的资源的应用逻辑。JSP将网页逻辑与网页设计和显示分离,支持可重用的基于组件的设计,使基于Web的应用程序的开发变得迅速和容易。 Web服务器在遇到访问JSP网页的请求时,首先执行其中的程序段,然后将执行结果连同JSP文件中的HTML代码一起返回给客户。插入的Java程序段可以操作数据库、重新定向网页等,以实现建立动态网页所需要的功能。 JSP与Java Servlet一样,是在服务器端执行的,通常返回该客户端的就是一个HTML文本,因此客户端只要有浏览器就能浏览。
三.JSP 语法
<% ... %> jsp代码块 ,可以嵌入任意的有效的Java代码,一个jsp页面中可以嵌入任意多个代码块,转换时这些代码块会移动到jsp的业务逻辑方法中
列子:
<%
int a = 0;
System.out.print("hello hello");
String username = (String)request.getParameter("username");
%>
能否在JSP脚本里定义方法?
不能!
//脚本相当于方法,不能在方法里定义方法
<%!
public
void
helloworld(){}%>
//可以声明方法
<%
public
void
helloworld(){}%>
//编译出错,无法运行
四.JSP外部导入
<%@ include file="/WEB-INF/header.jsp"
//导入外部代码
%>
在做网站的时候可以定义一个header.jsp 这样可以实现每一个网页都能显示相同的头部内容
另外,jsp里面的注释也是通过//来注解,当然也有其他的方式注解
<!-- <% out.print("嘿嘿嘿"); %> --> //这里的内容会发送到客户端,但浏览器不会显示
五.JSP表达式:
<%= %>用来直接输出表达式的值,(没有分号),不是必须的语法
<%=1+2+3+a+b %>方便我们向页面输出内容,相当于<% out.print(...); %>
六.JSP指令集合,通过page元素来指定页面的特性
<%@ page xxx="xxx" %>
language="java"
pageEncoding="UTF-8" //指定页面保存时的编码方式
contentType="text/html; charset=UTF-8" //指定content-type响应头信息
import="java.util.*"
extends="" //指定jsp继承的Servlet类,当继承自定义Servlet时使用
session="true" //是否创建session
errorPage="" //指定此jsp出错时跳转到的错误页面
isErrorPage="false" //指定此jsp是错误处理页面
autoFlush="true" //指定out对象的缓冲区是否自动刷新
buffer="8kb" //指定out对象的缓冲区的大小
七、MVC模式
M ->mode 模型层 -> javaBeen (比如 UserDao,UserInfo)
V ->view 视图层 -> html , jsp
C ->controller 控制层 ->由Servlet担当
八.案列:通过jsp向写入服务器的错误信息给硬盘案列
servlet端部分代码
try
{
JdbcUtils.executeUpdate("insert into T_Persons2(Name,Age) values(?,?)", name,age);
//插入数据 executeupdate
resp.sendRedirect("person?action=list");
} catch (SQLException e)
{
req.setAttribute("msg","插入数据执行失败");//把jsp要用的数据放到reques中
//让"/MyError.jsp"去显示数据
req.getRequestDispatcher("/Myerror.jsp").forward(req, resp);
//resp.sendRedirect("MyError.jsp");
}
/*
req.setAttribute("msg", "插入数据和执行失败");
req.getRequestDispatcher("/Error1.jsp").forward(req,resp);
*/
JSP端
<%@page import="java.io.BufferedWriter"%>
<%@page import="java.io.OutputStreamWriter"%>
<%@page import="java.io.OutputStream"%>
<%@page import="java.io.FileOutputStream"%>
<%@page import="com.rupeng.test1.JdbcUtils"%>
<%@ page language="java" contentType="text/html;charset=UTF-8" isErrorPage="true"
pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<%
FileOutputStream fos=new FileOutputStream("G://error.txt");
OutputStreamWriter osw =new OutputStreamWriter(fos);
BufferedWriter bf=new BufferedWriter(osw);
bf.write(exception.toString());//exception通过内置对象得到错误信息
bf.close();
osw.close();
fos.close();
%>
</body>
</html>
九.JSP 内置对象
为了简化jsp表达式和脚本片断代码的编写,JSP一共提供了9个预先定义的变量
而上述的案列中
bf.write(exception.toString());
这行代码就是调用了隐式对象也叫做内置对象来获得错误信息并输出到G盘的error.txt文件里
只要在专门用于错误处理的页面,才有这个 对象,将页面设为错误页: <%@ page isErrorPage="true" %>,
则会发现 在上面的 _jspService 方法中又多了一个 exception 对象,Throwable exception = org.apache.jasper.runtime.JspRuntimeLibrary.getThrowable(request);