jsp
- jsp是一个servlet
一.jsp的定义
- jsp是动态网页技术,可以动态获取数据,响应数据。
- jsp是网页静态化技术 ,jsp最终将动态获取到的数据进行渲染,以html静态网页显示给浏览器看。
- 静态化技术: jsp,framemarker,thymeleaf。
- jsp其实就是servlet,jsp文件的执行过程:转换(servlet), 编译class。
- jsp是在html页面中可以进行Java代码的编写, jsp文件中可以编写html、css、js、java代码 。
1.jsp的特点
- 能以模板化的方式简单、高效地添加动态网页内容。
- 可利用JavaBean和标签库技术复用常用的功能代码(设计好的组件容易实现重复利用,减少重复劳动)。标签库不仅带有通用的内置标签(JSTL),而且支持可扩展功能的自定义标签。
- 有良好的工具支持。
- 继承了Java语言的相对易用性。
- 继承了Java的跨平台优势,实现“一次编写,处处运行”。因为支持Java及其相关技术的开发平台多,网站开发人员可以选择在最适合自己的系统平台上进行JSP开发;不同环境下开发的JSP项目,在所有客户端上都能顺利访问。
- 页面中的动(控制变动内容的部分)/静(内容不需变动的部分)区域以分散但又有序的形式组合在一起,能使人更直观地看出页面代码的整体结构,也使得设计页面效果和程序逻辑这2部分工作容易分离(外观视图与逻辑分离)。从而方便分配人员并发挥各自长处,实现高效地分工合作。
- 可与其它企业级Java技术相互配合。JSP可以只专门负责页面中的数据呈现,实现分层开发。
2.jsp作用:
- 作用服务器端的页面java server page,主要作用使用来获取服务器端的数据,将数据进行渲染,响应给客户端。jsp用来获取servlet获取到的数据 ,进行显示。
- jsp还可以获取请求数据,逻辑控制,数据显示。
二.jsp的创建和使用
1.jsp的创建
- 创建:后缀式jsp。
- 在eclipse中,jsp文件位置在WebContent文件夹下。
1.1设置编码
- Window-----Preferences------Web------JSP Files
1.2基本格式
- 比html多了一个jsp指令
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
</body>
</html>
1.3将html页面转为jsp页面
- 在实际开发中,所有的jsp页面都是html页面变过来的(实际工作Javaweb程序是没有html页面的).
- 注意不能将jsp的指令直接粘贴到html页面中,尽量不要直接将html页面的后缀直接改为jsp(也对)。
- 将html文件复制到jsp页面,要放到指令的下面。
jsp的工作原理 :
- jsp文件在服务器启动的时候,web项目才会加载到本地tomcat中。
- jsp在第一次被访问的时候,jsp文件会转换为java文件并编译,编译为class文件。
- tomcat—work----catelina----项目名-----org----apache-----jsp下
- jsp转换之后的代码和servlet的输出代码对比
- 修改了jsp页面的代码,一定要重新启动服务器,避免因为缓存而未生效。
- jsp文件转化为java进而转化为class文件。
- update.jsp-----没有重新转换位Java文件 —无法重新编译为class
2. jsp的内容介绍
2.1jsp指令元素
基本语法:<%@ 指令名 属性=“值” %>
- <%@ page %>
- <%@ include file=" ** "%>
- <%@ taglib prefix=“x” uri=“xxxx” %>
2.1.1基本语法: <%@ page %>
属性:
- language=“java“ --定义jsp适用的编程语言,目前唯一允许的语言是java
- errorPage=“**.jsp” --报错跳转页面
- isErrorPage=“true” --表示当前页面是出错显示页面
- import=“importList” --引入的包,可以是java类
- contentType="text/html; charset=UTF-8“ 响应文本类型和编码
- buffer=“none/kb size” --默认8kb
- session=“true/false” --是否使用session,默认true
- autoFlush=“true/false” --缓存是否自动清除,默认true
- pageEncoding=“UTF-8” jsp页面的字符编码
2.1.2基本语法: <%@ include file=“**”%>
- 将指定的jsp或html包含进页面中,页面编译后,加载include进的页面。
- 加进来的页面不能加参数。
一个页面是由三个页面组成的
- 底部和头部的固定页面。
- top.jsp随着index.jsp页面一起加载的。
- jsp页面的相互引用,随着jsp文件一起加载。
- index.jsp,在转换时,就要加载demo.jsp。
- include指令可以实现页面的重复引用。
2.1.3基本语法:<%@ taglib prefix=“x” uri=“xxxx” %>
- 需要导入的标签库:jstl标签库,standard.jar.
2.2jsp动作元素
- 动作元素基本上都是预定义的函数,JSP规范定义了一系列的标准动作,它用JSP作为前缀,可用的标准动作元素如下:
- 与JSP指令元素不同的是,JSP动作元素在请求处理阶段起作用。
语法 | 描述 | 常见属性和含义 |
jsp:include | 在页面被请求的时候引入一个文件。 | 1.page:包含在页面中的相对URL地址。 2.flush 布尔属性,定义在包含资源前是否刷新缓存区。 |
jsp:useBean | 寻找或者实例化一个JavaBean。 | 1.class:指定Bean的完整包名。 2.type:指定将引用该对象变量的类型。 3.beanName:通过 java.beans.Beans 的 instantiate() 方法指定Bean的名字。 |
jsp:setProperty | 设置JavaBean的属性。 | 1.name:name属性是必需的。它表示要设置属性的是哪个Bean。 2.property property属性是必需的。它表示要设置哪个属性。有一个特殊用法:如果property的值是"*",表示所有名字和Bean属性名字匹配的请求参数都将被传递给相应的属性set方法。 3.value:value 属性是可选的。该属性用来指定Bean属性的值。字符串数据会在目标类中通过标准的valueOf方法自动转换成数字、boolean、Boolean、 byte、Byte、char、Character。例如,boolean和Boolean类型的属性值(比如"true")通过 Boolean.valueOf转换,int和Integer类型的属性值(比如"42")通过Integer.valueOf转换。 4.param:param 是可选的。它指定用哪个请求参数作为Bean属性的值。如果当前请求没有参数,则什么事情也不做,系统不会把null传递给Bean属性的set方法。因此,你可以让Bean自己提供默认属性值,只有当请求参数明确指定了新值时才修改默认属性值。 value和param不能同时使用,但可以使用其中任意一个。 |
jsp:getProperty | 输出某个JavaBean的属性。 | 1.name:要检索的Bean属性名称。Bean必须已定义。 2.property:表示要提取Bean属性的值 |
jsp:forward | 把请求转到一个新的页面。(请求转发 ) | page:page属性包含的是一个相对URL。page的值既可以直接给出,也可以在请求的时候动态计算,可以是一个JSP页面或者一个 Java Servlet. |
常见的属性
- 所有的动作要素都有两个属性:id属性和scope属性。
- id属性: id属性是动作元素的唯一标识,可以在JSP页面中引用。动作元素创建的id值可以通过PageContext来调用。
- scope属性: 该属性用于识别动作元素的生命周期。 id属性和scope属性有直接关系,scope属性定义了相关联id对象的寿命。 scope属性有四个可能的值: (a) page, (b)request, ©session, 和 (d) application。
- include指令是在index文件加载的时候加载top文件 , 在请求jsp文件的时候才去加载需要的元素。
- text元素,直接写内容就可以了。
- javabean对象的操作,使用set和get方法对属性进行赋值和取值。
- 要操作的对象必须符合javabean对象的要求,属性私有化,有set和get方法,必须有无参数构造方法,属性名严格按照命名规则去写.
- 添加标签元素对象
语法 | 描述 |
jsp:plugin | 根据浏览器类型为Java插件生成OBJECT或EMBED标记。 |
jsp:element | 定义动态XML元素。 |
jsp:attribute | 设置动态定义的XML元素属性。 |
jsp:body | 设置动态定义的XML元素内容。 |
jsp:text | 在JSP页面和文档中使用写入文本的模板。 |
- jsp:element 、 jsp:attribute、 jsp:body动作元素动态定义XML元素。动态是非常重要的,这就意味着XML元素在编译时是动态生成的而非静态。
- 以下实例动态定义了XML元素:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>标签</title>
</head>
<body>
<jsp:element name="xmlElement">
<jsp:attribute name="xmlElementAttr">
属性值
</jsp:attribute>
<jsp:body>
XML元素的主体
</jsp:body>
</jsp:element>
</body>
</html>
2.3jsp脚本元素
- 脚本指的就是java代码,可以在脚本元素中编写所有的java代码。最终的结果以jsp转换为java代码为准。<%! %> <% %> <%= %>
2.3.1<%! %>
- 声明脚本,声明全局变量。
<%! int a=100; %><!--全局变量-->
2.3.2 <% %>
- java逻辑代码(可以编写任意的java文件),声明的变量是局部变量。
<%int a=50;%><!--局部变量,局部优先原则-->
2.3.3<%= %>
- 输出脚本,给页面显示内容。
<%=a%>
所有的脚本可以和html标签进行随意嵌套。
3.小例子
- 使用java对象的时候注意导包
3.1创建java对象来显示信息
<%
// 创建对象
//将鼠标放到要导包的后面,Alt+?快捷方式进行导包
Student stu=new Student();
stu.setS_id(1);
stu.setS_name("张三");
%>
<%=stu.toString() %>
<hr>
3.2创建集合对象显示信息
<%
//创建数组
Student[] stus=new Student[3];
Student stu01=new Student();
stu01.setS_id(2);
stu01.setS_name("李四");
Student stu02=new Student();
stu02.setS_id(3);
stu02.setS_name("王五");
Student stu03=new Student();
stu03.setS_id(4);
stu03.setS_name("赵六");
stus[0]=stu01;
stus[1]=stu02;
stus[2]=stu03;
%>
<%=stus[1].toString() %>
3.3获取数据库数据显示信息
- 获取数据库中的信息,并且将数据与html结合结合输出。
- jsp连接数据库操作.jsp页面,使用jsp脚本来连接数据库,用html结合脚本将数据库查询到的所有信息放到表格中进行显示,每一行数据都有一个删除按钮,点击删除按钮之后,去请求delServlet.
- Student.java
package com.nebula.bean;
public class Student {
private int s_id;
private String s_name;
public Student() {
super();
// TODO Auto-generated constructor stub
}
public Student(int s_id, String s_name) {
super();
this.s_id = s_id;
this.s_name = s_name;
}
public int getS_id() {
return s_id;
}
public void setS_id(int s_id) {
this.s_id = s_id;
}
public String getS_name() {
return s_name;
}
public void setS_name(String s_name) {
this.s_name = s_name;
}
@Override
public String toString() {
return "Student [s_id=" + s_id + ", s_name=" + s_name + "]";
}
}
- jsp数据库.jsp
<%@page import="com.nebula.bean.Student"%>
<%@page import="java.util.List"%>
<%@page import="java.util.ArrayList"%>
<%@page import="java.sql.ResultSet"%>
<%@page import="java.sql.PreparedStatement"%>
<%@page import="java.sql.Connection"%>
<%@page import="java.sql.DriverManager"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
//连接数据库,进行数据的获取
List<Student> stus=new ArrayList<Student>();
Class.forName("com.mysql.jdbc.Driver");
Connection connection=DriverManager.getConnection("jdbc:mysql://localhost:3306/stumanage?characterEncoding=utf-8", "root","123456");
String sql="select id ,name from student";
PreparedStatement pst= connection.prepareStatement(sql);
ResultSet rs= pst.executeQuery();
while(rs.next()){
Student stu=new Student();
stu.setS_id(rs.getInt("id"));
stu.setS_name(rs.getString("name"));
stus.add(stu);
}
%>
<div align="center">
<table border="1px" width="500px">
<thead>
<tr>
<th>编号</th>
<th>姓名</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<%
for(Student stu : stus){
%>
<tr>
<td><%=stu.getS_id() %></td>
<td><%=stu.getS_name() %></td>
<td><a href="delStudent?stuid=<%=stu.getS_id()%>">删除</a></td>
</tr>
<%
}
%>
</tbody>
</table>
</div>
</body>
</html>
- DelServlet.java
package com.nebula.servlet;
import java.io.IOException;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.mysql.jdbc.Connection;
/**
* Servlet implementation class DelServlet
*/
@WebServlet("/delStudent")
public class DelServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public DelServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取jsp页面的删除请求
String id=request.getParameter("stuid");
//调用数据库的连接操作,根据id删除数据库中的信息
delStudentById(Integer.valueOf(id));
//删除之后在回到显示页面
request.getRequestDispatcher("jsp数据库.jsp").forward(request, response);
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
//根据id删除数据
public void delStudentById(int s_id) {
try {
Class.forName("com.mysql.jdbc.Driver");
Connection connection=(Connection) DriverManager.getConnection("jdbc:mysql://localhost:3306/stuManager?characterEncoding=utf-8","root","123456");
String sql="delete from student where s_id=?";
PreparedStatement pst = connection.prepareStatement(sql);
pst.setInt(1, s_id);
pst.executeUpdate();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
- DelServlet.java进行获取查询页面的a标签所带的参数stuid,在servlet中连接数据库,删除指定id的数据库对象,将请求再转发到查询页面,查询页面再去数据库中重新获取数据,此时之前删除的数据就不见了。
jsp就是servlet
- servlet有什么功能,jsp也可以实现同样功能。
- servlet中可以进行逻辑处理,获取数据,进行显示;jsp 也可以逻辑处理,获取数据,进行显示。
三.存在的问题
1.页面资源无法正常访问
- 样式丢失
- js不起作用
- img图片无法加载
可能是因为请求之后路径不对了。
2.请求转发和重定向
- 请求转发,一次请求,url路径不会改变。
- 重定向:请求路径会改变。
2.1 jsp----->jsp
2.2 jsp ---->servlet------jsp
index.jsp