jsp的定义,创建和使用

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

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值