欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JSP

程序员文章站 2022-06-01 21:10:47
...

JSP简介

(表示层技术)

1.什么是JSP

sun公司制定的一种服务器端的动态页面技术规范(sun公司被Oracle公司收购了)

注:生成动态页面,只需要写一个以".jsp"为后缀名的文件,该文件会被容器自动转换成一个对应的Servlet然后执行。也就是说,JSP本质就是一个Servlet!

(可在tomcat的安装目录下查看work目录下的D:\JavaDevTools\apache-tomcat-9.0.30\work\Catalina\localhost\jspdemo\org\apache\jsp)

2.如何写一个JSP?

1. 添加一个以.jsp为后缀的文件

2. 在该文件里面,可以使用如下几个元素:

  • html(css,javascript) 直接写即可

  • java代码

    1. 方式一:java代码片段

      <% java代码 %>

      time:<%
          Date date = new Date();
          out.print(date);
      %>
      
    2. 方式二:jsp表达式

      <%= java表达式 %>

      time:<%= new Date() %>
      
    3. 方式三:jsp声明

      <%! 声明变量或者方法 %>

      <%!
          String info = "您好";
      %>
      <%= info>
      <%!
          int sum(int a,int b){
          	return a + b;
      	}
      %>
      <%= sum(2,4) %>
      
      // 这个编译成.java文件就是一个成员变量或者方法,它不在service方法中!!!
      
  • 隐含对象(内置对象)

    1. 什么是隐含对象?

      直接可以使用的对象,比如out、request和response。
      
      out = pageContext.getOut();
      
    2. 为什么可以直接使用这些隐含对象?

      容器会自动添加获得这些对象的代码。
      
    3. 有哪些隐含对象?

      session:HttpSession接口的实现,也就是session对象。
          //javax.servlet.http.HttpSession session = null;
      	//session = pageContext.getSession();
      application:ServletContext接口的实现,也就是Servlet上下文。
          //注:容器启动之后,会为每一个web应用(比如jspdemo)创建唯一的一个符合ServletContext接口要求的对象,该对象称之为Servlet上下文。该对象会一直存在,除非容器关闭或者应用被删除
          //final javax.servlet.ServletContext application;
          // application = pageContext.getServletContext();
          // 全局共享的,都可以访问
      pageContext:PageContext接口的实现,也就是页面上下文
          //注:容器会为每一个JSP实例创建唯一的一个符合PageContext接口要求的对象,该对象称之为页面上下文。该对象会一直存在,除非JSP实例被销毁。pageContext提供了一些用来获得其他所有的隐含对象的方法(用于JSP标签,JSP标签类可以通过该对象来访问到其他隐含对象)
          // 一个JSP实例对应一个pageContext(页面上下文)
          // pageContext会一直存在,除非JSP实例被删除
          // 注:绑定到pageContext上的数据只有与之对应的jsp实例能够访问到。
      config:ServletConfig接口的实现。
          // 注:可以通过该对象读取初始化参数。
          // final javax.servlet.ServletConfig config;
          // config = pageContext.getServletConfig();
      exception:用来获得JSP运行时产生的异常信息的
          // 注:只有当page指令的isErrorPage属性值为true时,才能使用该隐含对象
      page(从来不用的,了解):JSP实例本身
      	注意:JSP实例指的是JSP对应的Servlet实例
      

JSP

示例:

 示例:

 ```jsp
 <%@ page contentType="text/html; charset=utf-8"
     pageEncoding="utf-8"%>
 <html>
 <head>
 	<title></title>
 </head>
 <body style="font-size:30px">
     <!-- 隐藏对象session -->
 	sessionId: <%= session.getId() %>
     <!-- 隐藏对象application -->
     <% 
 		application.setAttribute("username", "林龙"); 
 	%>
 	username:<%= application.getAttribute("username") %>
     <!-- 隐藏对象config -->
     <!-- 先在web.xml中配置servlet,然后就可以通过config.get方法来获取了
     <servlet>
   		<servlet-name>test7</servlet-name>
   		<jsp-file>/test7.jsp</jsp-file>
 		<init-param>
   			<param-name>company</param-name>
   			<param-value>某公司</param-value>
   		</init-param>
   	</servlet>
 	<servlet-mapping>
         <servlet-name>test7</servlet-name>
         <url-pattern>/test.html</url-pattern>
   </servlet-mapping> -->
     公司名:<%= config.getInitParameter("company") %>
 </body>
 </html>
 ```

 示例exception:

 ​	test8.jsp

 ```jsp
 <%@ page contentType="text/html; charset=utf-8"
     pageEncoding="utf-8" errorPage="test9.jsp" %>
 <html>
 <head>
 	<title></title>
 </head>
 <body style="font-size:30px">
 	<% 
 		String number = request.getParameter("number");
 		int number1 = Integer.parseInt(number);
 		out.print(number1 * 2);
 	%>
 </body>
 </html>
 ```

  test9.jsp

 ```jsp
 <%@ page contentType="text/html; charset=utf-8"
     pageEncoding="utf-8" isErrorPage="true" %>
 <html>
 <head>
 	<title></title>
 </head>
 <body style="font-size:30px">
 	请输入合法的数字!
 	<%= exception.getMessage() %>
 </body>
 </html>
 ```
  • 指令

    1. 什么是指令?

      通知容器,在将JSP转换成对应的Servlet时做一些额外的处理,比如导包。

    2. 语法格式

      <%@ 指令名  属性=值  %>
      
    3. page指令

      import属性:用于指定要导的包名,比如:

      <%@ page import="java.util.*"%>
      
      <%@ page import="java.util.* , java.text.*"%>
      

      contentType属性:用于设置response.setContentType方法的 MIME类型。

      pageEncoding属性:用于设置JSP文件的编码(保存在硬盘上)。

      ​ (如果不加的话,部分容器是默认使用ISO8859-1来编码)

      <%@ page import="java.util.*" contentType="text/html; charset=utf-8" 
      	pageEncoding="utf-8" %>
      

      errorPage属性:指定一个异常处理页面。当JSP运行时发生了异常,则容器会调用异常处理页面来处理。

      <%@ page contentType="text/html; charset=utf-8"
          pageEncoding="utf-8" errorPage="test9.jsp" %>
      <html>
      <head>
      	<title></title>
      </head>
      <body style="font-size:30px">
      	<% 
      		String number = request.getParameter("number");
          	// 这里类型转换时会发生异常
      		int number1 = Integer.parseInt(number);
      		out.print(number1 * 2);
      	%>
      </body>
      </html>
      

      isErrorPage属性:缺省值是false,当值为true时,表示这是一个异常处理页面。

      <%@ page contentType="text/html; charset=utf-8"
          pageEncoding="utf-8" isErrorPage="true" %>
      <html>
      <head>
      	<title></title>
      </head>
      <body style="font-size:30px">
      	请输入合法的数字!
      	<%= exception.getMessage() %>
      </body>
      </html>
      

JSP

3.JSP是如何执行的?

  • 阶段一:容器将JSP转换成一个对应的Servlet。

    a.  html(css,js) --------> 在service方法里,使用out.write输出。
    
    b. <%          %> --------->照搬到service方法里面。
    
    c. <%=        %>  --------->在service方法里,使用out.print输出。
    
    d. <%!        %>----------->添加新的成员变量或者方法
    
    

    示例:

    	out.write("\r\n");
    	out.write("<html>\r\n");
        out.write("\t<head></head>\r\n");
        out.write("\t<body style=\"font-size:30px;\">\r\n");
        out.write("\t\t加油!\r\n");
        out.write("\t\ttime:");
        out.print( new Date() );
        out.write("\r\n");
        out.write("\t\t<br />\r\n");
        out.write("\t\ttime:");
    
            Date date = new Date();
            out.print(date);
    
        out.write("\r\n");
        out.write("\t\t<br />\r\n");
        out.write("\t\tHello JSP!\r\n");
        out.write("\t\t");
    
    			for(int i=0;i<100;i++){
    				out.print("Hello JSP <br />");
    			}
    
  • 阶段二:容器调用该Servlet。

    注:容器会将这个Servlet进行编译,然后实例化、初始化,最后调用其方法(service方法)。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WmabIu8H-1583583934952)(C:/Users/雪麟锋/Downloads/day02_all/a0.png)]

    示例1:写一个Date.jsp,输出当前的系统日期,比如输出2020年02月22日

    <%@ page import="java.util.*, java.text.*" 
        contentType="text/html; charset=utf-8" 
    	pageEncoding="utf-8" %>
    <html>
    	<head></head>
    	<body style="font-size:30px;">
    		系统当前时间是:
    		<%
    			Date now = new Date();
    			SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");
    			String str = sdf.format(now);
    			out.print(str);
    		%>
    	</body>
    </html>
    

    示例2:写一个“用户列表”,即将用户表中的所有用户信息以表格的形式来展现。

    <%@ page import="java.util.* ,dao.*, entity.*" contentType="text/html; charset=utf-8" 
    	pageEncoding="utf-8" %>
    <html>
    	<head>
    		<style>
    			.row1{
    				background-color:#0f0;
    			}
    			.row2{
    				background-color:#f0f;
    			}
    			
    		</style>
    	</head>
    	<body style="font-size:30px">
    		<table border="1" width="60%" cellpadding="0">
    			<tr>
    				<td>ID</td>
    				<td>姓名</td>
    				<td>密码</td>
    				<td>邮箱</td>
    			</tr>
    			<%
    				UserDAO dao = new UserDAO();
    				List<User> users =  dao.findAll();
    				for(int i=0;i<users.size();i++){
    					User user = users.get(i);
    					%>
    					<tr class="row<%= i%2+1%>">
    						<td><%= user.getId() %></td>
    						<td><%= user.getUsername() %></td>
    						<td><%= user.getPwd() %></td>
    						<td><%= user.getEmail() %></td>
    					</tr>
    					<%
    				}
    			%>
    		</table>
    	</body>
    </html>
    

4.转发

  • 什么是转发?

    一个web组件将未完成的处理交给另外一个web组件继续做。

    1. web组件是Servlet和JSP的统称
    2. 常用的场景是Servlet获取数据之后转发给JSP,由JSP来展现

JSP

  • 如何转发

​ step1.将数据绑订到request对象上。

request.setAttribute(String name,Object obj);
注:
   绑订的本质就是map.put(name,obj);
   Object request.getAttribute(String name);

step2.获得转发器。

RequestDispatcher rd = request.getRequestDispatcher(String uri);
注:
   RequestDispatcher是一个接口,该方法会返回一个符合该接口要求的对象,我们称之为转发器。
   uri是转发的地址,一般是一个JSP。
   

step3.转发

rd.forward(request,response);
  • 转发与重定向的区别

    • 能否共享request对象?

      ​ 转发可以,而重定向不行。

      注:容器收到请求之后,会立即创建request和response,当响应发送完毕,会立即销毁这两个对象。也就是说,request和response对象的生存时间是一次请求与响应期间存在。 
      
    • 浏览器地址栏的地址有无变化?

      ​ 转发没有变化,而重定向有变化。

    • 地址有无限制?

      ​ 转发有限制,要求属于同一个web应用,而重定向没有任何限制。

    • 一件事是否已经做完?

      ​ 转发是一件事没有做完,让另外一个web组件继续做;而重定向是一件事已经完成,然后再做另外一件独立的事情。

相关标签: Java