jsp入门学习

jsp基础

1、jsp入门

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2、JSP中java脚本
  • <% %>:代码片段,用于定义0到N条java语句(方法内能放什么,他就能放什么)
  • <%= %>:java表达式,用于输出,用于输出一条表达式(或变量)的结果。response.getWriter().print( … );这里可以放什么,他就可以放什么
  • <%! %>:声明,用来创建类成员变量和成员方法,类中可以放什么,他就可以放什么
3、JSP与Servlet分工案例

在这里插入图片描述

4、JSP原理

在这里插入图片描述

5、JSP注释
<%-- ... --%>
  • 当服务器把jsp编译成java文件已经忽略了注释部分!

Cookie

1、Cookie入门

在这里插入图片描述

  • response.addCookie()向浏览器保存Cookie
  • request.getCookies()获取浏览器归还的Cookie
2、Cookie的生命
  • Cookie的maxAge:Cookie的最大生命,即Cookie可以保存的最大时长,以秒为单位
    • cookie.setMaxAge(60)表示这个Cookie会被浏览器保存到硬盘60秒
  • maxAge>0:浏览器会把Cookie保存到客户机的硬盘上,有效时间为maxAge的值决定
  • maxAge<0:Cookie只会在浏览器的内存中存在,当用户关闭浏览器时,浏览器进程结束,同时Cookie也就被删除了;
  • maxAge=0:浏览器会马上删除这个Cookie
3、Cookie的路径
  • Cookie的path,能把Cookie带回服务器的Cookie的path,相当于,Cookie当前的访问路径包含Cookie的默认path,就可以在访问路径时将Cookie带回服务器

在这里插入图片描述

4、Cookie的域

在这里插入图片描述

HttpSession

Httpsession入门
1、HttpSession概述
  • HttpSession是由JavaWeb提供的,用来会话跟踪的类,session是服务器端的对象,保存在服务器端!
  • HttpSession是Servlet的三大域值对象之一(request、session、application(ServletContext))
  • HttpSession底层依赖Cookie、或是URL重写!、
2、HttpSession的作用

在这里插入图片描述

  • HttpSession session = request.getSession();
HttpSession案例介绍
1、一
  • a.jsp
<h1>保存Session</h1>
	<%
		session.setAttribute("aaa", "AAA");
	%>
  • b.jsp
	<h1>获取Session</h1>
	<%
	String s = (String)session.getAttribute("aaa");
	%>
	<%= s %>
2、二

在这里插入图片描述

在这里插入图片描述

  • login.jsp
<h1>登录</h1>
	<%
		/*
			读取名为uname的Cookie
			如果为空显示:""
			如果不为空显示Cookie的值
		*/
		String uname="";
		Cookie[] cs = request.getCookies(); //获取reques的所有Cookie
		if(cs != null){ //如果存在Cookie
			for(Cookie c : cs){ // 遍历Cookie
				if("uname".equalsIgnoreCase(c.getName())){ // 查找名为uname的Cookie
					uname = c.getValue();// 获取Cookie的值
				}
			}
		}
	%>
	<%
		String message = "";
		String msg = (String)request.getAttribute("msg");
		if(msg != null){
			message = msg;
		}
	%>
	<font color="red"><b><%=message %></b></font>
	
	<form action="/JspWebS/LoginServlet" method="post">
		<%--把cookie中的用户名显示到用户文本框中 --%>
		用户名:  <input type="text" name="userName" value="<%=uname%>"/><br/>
		密    码: <input type="password" name="password"/><br/>
		<input type="submit" value="提交"/>
	</form>
  • LoginServlet
public class LoginServlet extends HttpServlet {
	@Override
	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		/**
		 * 	获取表单数据
		 */
		// 处理中文问题
		request.setCharacterEncoding("UTF-8");
		// 获取
		String username	= (String)request.getParameter("userName");
		String password = (String)request.getParameter("password");
		
		/**
		 * 校检用户名和密码是否正确
		 */
		if(!"admin".equalsIgnoreCase(username)) { // 登录成功
			/**
			 * 	把用户名保存到Cookie,发送客服端浏览器
			 * 	当再次打开login.jsp时,login.jsp会读取request中的Cookie,把它显示到用户文本框中
			 */
			Cookie cookie = new Cookie("uname" , username);
			cookie.setMaxAge(60*60); //设置cookie生命时长为1hour
			response.addCookie(cookie); //保存cookie
			
			
			/**
			 * 如果成功 保存到session中
			 * 冲定向到succ1.jsp
			 */
			HttpSession session = request.getSession(); // 获取session
			session.setAttribute("username", username); // 向session域中保存用户名
			response.sendRedirect("/JspWebS/session1/succ1.jsp");
		}else {// 登录失败
			/**
			 * 如果失败 保存错误信息到request域中
			 * 转发到login.jsp中
			 */
			
			request.setAttribute("msg", "用户名或密码错误");//
			RequestDispatcher rs =  request.getRequestDispatcher("/session1/login.jsp"); //转发器
			rs.forward(request, response); // 转发
		}
	}
  • succ1.jsp
<%
	String username = (String)session.getAttribute("username");
	if(username == null){
		/*
		* 向request中保存错误信息,转发到login.jsp中
		*/
		request.setAttribute("msg", "您还没有登录,请不要冒充领导!");
		request.getRequestDispatcher("/session1/login.jsp").forward(request, response);
		return;
	}
%>
欢迎欢迎,热烈欢迎,欢迎<font color="green"><b><%=username %></b></font>领导指导工作
HttpSeesion原理

在这里插入图片描述

session最大不活动时间

在这里插入图片描述

URL重写

在这里插入图片描述

验证码

在这里插入图片描述

JSP指令

page指令
  • 语法:<%@ page language=“java” … %>

  • pageEncoding:他指定当前jsp页面编码,只要不说谎,就不会有乱码,在服务器要把jsp编译成.java时需要使用PageEncoding

  • contentType:他表示添加一个响应头,Context-Type,等同于response.setContentType(“text/html;caharset=utf-8”)

  • 如果两个属性只提供了一个,那么另一个的默认值已为设置的那一个

  • 如果两个属性都没有设置,那么默认值为iso

  • import : 导包! 可以出现多次

  • errorPage:当前页面如果抛出异常,那么要转发到哪一个页面,由errorPage来指定

  • isErrorPage:它指定当前页面是否为处理错误的页面!当前属性为true时,这个页面会设置状态码为500,而且这个页面可以使用9大内置对象中的exception;

  •  <error-page>
      	<error-code>404</error-code>
      	<location>/error/errorPage.jsp</location>
      </error-page>
      <error-page>
      	<error-code>500</error-code>
      	<location>/error/errorPage.jsp</location>
      </error-page>
      <error-page>
      	<exception-type>java.lang.RuntimeException</exception-type>
      	<location>/index.jsp</location>
      </error-page>
    
  • autoFlush:指定jsp的输出流缓冲区满时,是否自动刷新,默认为true,如果为false,那么缓冲区满时抛出异常!

  • buffer:指定缓冲区大小,默认为8kb,通常不需要修改!

  • isELIgnored:是否忽略EL表达式,默认为false,不忽略,即支持!

  • 没啥用的属性:

    • language:指定当前jsp编译后的语言类型,默认值为java
    • info:信息!
    • isThreadSafe:当前jsp是否支持并发访问
    • session:当前页面是否支持session,如果为false,那么当前页面就没有session这个内置对象了
    • extend:让jsp生成的servlet去继承属性指定的类
pageContext对象

在这里插入图片描述

  • 域对象功能
  • 代理其他域对象功能
  • 获取其他内置对象

在这里插入图片描述

在这里插入图片描述

include和taglibzhiling
1、include
  • 静态包含
    • 与RequestDispatcher的include()的功能很相式
    • <%@include file="" %>他是在jsp编译成java文件时完成的,他们共同生成一个java(就是一个servlet)文件,然后在生成一个*.class文件 (运行前执行)(两个jsp文件)
    • 与RequestDispatcher的include() ,包含和被包含是两个servlet,即有两个*.class,他们只是把相应的内容在运行时合并!(运行时) (<jsp:include >)(动态包含)
    • 作用:把页面分解了,使用包含的方式组合在一起,这样一个页面中不变的部分,就是一个独立的jsp,而我们只需要处理变化的页面
2、taglib
  • 导入标签库
    • 两个属性:
      • prefix:指定标签库在本页面中的前缀,有开发人员自己创建
      • url:指定标签库的位置
      • <%@taglib prefix=“x” url=”“/struts-tags” %> 前缀的用法<x:text >

JSP动作标签

在这里插入图片描述

JavaBean

1、JavaBean的规范
  • 必须有默认的构造器
  • 提供set/get方法,如果只有get方法,那么这个属性只是只读属性
  • 属性:有get/set方法的成员,还可以没有成员,只有get/set方法,属性名称有get/set方法来决定,而不是成员名称!
  • 方法名称满足一定的规范,那么他就是属性,boolean类型的属性值,它的读方法可以是is开头,也可以是get开头!
2、内省
  • 内省 –> BeanInfo –> 属性描述符 –> 属性的get/set对应的Method –> 可以反射了!

  • commos-beanutils,它是依赖内省完成的!
    在这里插入图片描述

3、JSP中与JavaBean相关的标签

在这里插入图片描述

EL

1、EL入门
  • EL是jsp内置的表达式语言

    • jsp2.0开始,不让使用java脚本,而使用EL表达式和动态标签来代替java脚本
    • EL替代的是<%= … %>,也就是说EL只能做输出
  • EL表达式来读取四大域

    • ${xxx},全域查找xxx属性,如果不存在输出空字符串,而不是null

    • 指定域获取属性

    • ${pageScope.xxx}、${requestScope.xxx}、${sessionScope.xxx}、${applicationScope.xxx}
      
2、EL11个内置对象

在这里插入图片描述

  • param:对应参数,它是一个Map,其中Key参数名,vaule是参数值,适用于单值参数

  • paramValues:对应参数,它是一个Map,其中Key参数名,vaule是参数值,适用于多值参数

  • 	<%-- map.key这是EL的语法 
      	map['key']也可以操作map
      	--%>
      	${param.username }
      	</br>
      	${paramValues.hobby[0] }</br>
      	${paramValues.hobby[1] }</br>
    
  • header:对应请求头,他是一个Map,其中Key表示头名称,value是单个头值,适用于单值请求头

  • headerValues:对应请求头,他是一个Map,其中Key表示头名称,value是多个头值,适用于多值请求头

  • ${header ['User-Agent'] }
    
  • initParam:获取<context-param>内的参数

  • <context-param>
      	<param-name>xxx</param-name>
    	<param-value>XXX</param-value>  
      </context-param>
      <context-param>
      	<param-name>yyy</param-name>
    	<param-value>YYY</param-value>  
      </context-param>
    
  • ${initParam.xxx}
    
  • cookie:Map<String , Cookie>类型,其中key是cookie的name,value是Cookie对象;

  • ${cookie.username.value}
    
  • ${cookie.JSESSIONID.value }
    
  • pageContext:他是PageContext类型!

  • ${pageContext.request.contextPath }
    
  • <body>
    ${pageContext.request.scheme }</br>
    	${pageContext.request.contextPath }
    	</br>
    	<a href="${pageContext.request.contextPath }/el/b.jsp">点击这里</a>
    	<form action="${pageContext.request.contextPath }/cookie/a.jsp" method="post">
    		<input type="submit" value="xxx"/>
    	</form>	
    </body>
    
EL函数库(由JSTL提供的)

在这里插入图片描述

EL自定义函数库

在这里插入图片描述

JSTL

JSTL标签库

在这里插入图片描述

  • core --> c标签!
    • out和set
      • 输出

        • value:可以是字符常量,也可以是EL表达式

        • default:当要输出的内容为null,会输出default指定的值

        • escapeXml:默认值为true,表示转义

        • <c:out value="${code }"></c:out></br>
          
      • 设置

        • var:变量名

        • Value:变量值,可以使EL表达式

        • scope:域,默认为page,可选值:page、request、session、application

        • <c:set var="it" value="itcast" scope="request"></c:set>
          <c:out value="${it }"></c:out>
          
  • remove
    • :删除域变量

      • var:变量名

      • scope:如果不给出scope,表示删除所有域中的该名称的变量,如果指定了域,那么只删除该域中的变量

  • url
      • value:指定一个路径,他会在路径前面自动添加项目名

        • 执行结果:/JspWebJSTL/out/a.jsp
      • 字标签:,用来给url后面添加参数

        • <c:url value="/out/a.jsp">
          	<c:param name="username" value="张三"/><%-- 可以对参数进行url编码--%>
          </c:url>
          
        
      
    • 执行结果:/JspWebJSTL/out/a.jsp?username=%SDFG%ASDFGHJ%ASDFG

    • var:指定变量名,一旦添加了这个属性,那么url标签就不会输出到页面,而是把生成的url保存到域中

      • scope:它与var一起使用,用来保存到指定的域中
  • if:对应java中if语句
    • - … 当test值为true 是才执行标签体内容
    • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hUAdb2nC-1615722428374)(jsp.assets/image-20200527174116541.png)]
  • choose:对应java中if/else if /else
    • <c:choose>
      <c:when test="">...</c:when>
      <c:when test="">...</c:when>
      <c:when test="">...</c:when>
      ...
      <c:otherwise>...</c:otherwise>
      </c:choose>
      
        
      - ```java
        //等同于
          if(...){
          }else if(...){
          }else if(...){
          }else if(...){
          }else{
          }
    
    • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JPnPLuMo-1615722428375)(jsp.assets/image-20200527174405976.png)]
  • forEach
    • 计数方式

      • 属性

        • var:循环变量
        • begin:设置循环变量从几开始
        • end:循环变量到几结束
      • step:设置步长,等同于java中的i++,i+=2 ,step默认为1

        • <c:forEach var="i" begin="1" end="10">
          ${i}
          </c:forEach>
          
       for(int i = 1 ; i <= 10 ; i++){
          	System.out.println(i);
       }
      
      • 用来输出数组、集合!

        • 属性

          • items:指定要循环谁,它可以是一个数组或一个集合
          • var:把数组或集合中的每个元素赋值给var指定的变量
        • <c:forEach items="${str }" var="strs">
          	${strs}</br>
          </c:forEach>
          
        • for(String strs : str){
          	System.out.println(strs);
          }
          
    • 循环状态

      • 可以使用varStatus来创建循环状态变量

      • 循环状态变量的属性

        • count:循环元素的个数
        • index:循环元素的下标
        • first:是否为第一个元素
        • last:是否为最后一个元素
        • current:当前元素
      • <c:forEach items="${list }" var="ele" varStatus="vs" >
        	${vs.index } ${vs.count } ${vs.first } ${vs.last } ${vs.current }</br>
        </c:forEach>
        
  • fmt(格式化库)
    • 格式化日期

      • <fmt:formatDate value="" pattern=""></fmt:formateDate>
        
        • value:指定一个Date类型的变量
        • pattern:用来指定输出的模板!例如:yyyy:MM:dd HH:mm:ss:SSS
    • 格式化数字

      • <fmt:formatNumber value="${num1 }" pattern="0.00"></fmt:formatNumber>
        
      • 保留小数点后两位,他会四舍五入,如果不足两位,以0补位

      • <fmt:formatNumber value="${num1 }" pattern="#.##"></fmt:formatNumber>
        
      • 保留小数点后两位,他会四舍五入,如果不足两位,不补位

自定义标签

自定义标签入门
  • 步骤:

    • 标签处理类(标签也是一个对象,那么就需要先有类)
    • tld文件,它是一个xml文件
    • 页面中使用<%@ taglib%>来指定文件的位置
  • 标签处理类

    • 在这里插入图片描述
  • 配置tld文件

    • 在这里插入图片描述
  • 页面中指定tld文件位置
    -在这里插入图片描述

标签体内容
  • empty:无标签体内容

  • JSP:jsp2.0已经不在支持这个类型!表示标签体内容可以是:java脚本,可以是标签,可以是EL表达式

  • scriptless:EL表达式,也可以是其他标签,也可以是字符串

  • tagdependent:标签体内容不会被执行,而是直接赋值标签处理类!

  • public class MyTag3 extends SimpleTagSupport{
    	@Override
    	public void doTag() throws JspException, IOException {
    		Writer out = this.getJspContext().getOut();// 获取当前jsp页面的输出流
    		out.write("*****************</br>");
    		this.getJspBody().invoke(out);// 执行标签体的内容,把结果写在指定的流中,即页面上
    		out.write("</br>*****************");
    	}
        
    }
    
  
  

#### 不执行标签下面的内容

- 在标签处理类中的doTag()中使用SkipPageException()来结束

  - Tomcat会调用标签处理类的doTag(),然后Tomcat会得到SkipPageException

- ```java
  public class MyTag4 extends SimpleTagSupport {
  	@Override
  	public void doTag() throws JspException, IOException {
  		this.getJspContext().getOut().print("只能看的见我,后面的都看不到!");
  		throw new SkipPageException(); // 抛出这个异常后,本标签后面的内容,将看不到!
  	}
  }
标签属性
  • 步骤:

    • 给标签处理类添加属性

      • 为标签处理类添加属性!属性至少需要一个set方法,这个set方法会在doTag()之前被Tomcat执行!所在的doTag()中就可以使用属性。

      • public class MyTag5 extends SimpleTagSupport {
        	private boolean test;
        	/**
        	 * 	这个方法会由tomcat调用,并且在doTag()之前
        	 * @param test
        	 */
        	public void setTest(boolean test) {
        		this.test = test;
        	}
        	@Override
        	public void doTag() throws JspException, IOException {
        		if(test) {
        			/**
        			 * 	执行标签体
        			 */
        			this.getJspBody().invoke(null);//如果传递的输出流为null,表示使用的就是当前页面的out!
        		}
        	}
        }
        
    • 在tld文件中对属性进行配置

      •  <tag>
          <name>mytag5</name>
          <tag-class>cn.itcast.tag.MyTag5</tag-class>
          <body-content>scriptless</body-content>
          <attribute>
          	<name>test</name> <!-- 指定属性名 -->
          	<required>true</required> <!-- 指定属性是否为必须的  -->
          	<rtexprvalue>true</rtexprvalue> <!-- 指定属性是否可以使用EL -->
          </attribute>
          </tag>
        

      /**
      * 这个方法会由tomcat调用,并且在doTag()之前
      * @param test
      /
      public void setTest(boolean test) {
      this.test = test;
      }
      @Override
      public void doTag() throws JspException, IOException {
      if(test) {
      /
      *
      * 执行标签体
      */
      this.getJspBody().invoke(null);//如果传递的输出流为null,表示使用的就是当前页面的out!
      }
      }
      }

      
      
      
      
    • 在tld文件中对属性进行配置

      •  <tag>
          <name>mytag5</name>
          <tag-class>cn.itcast.tag.MyTag5</tag-class>
          <body-content>scriptless</body-content>
          <attribute>
          	<name>test</name> <!-- 指定属性名 -->
          	<required>true</required> <!-- 指定属性是否为必须的  -->
          	<rtexprvalue>true</rtexprvalue> <!-- 指定属性是否可以使用EL -->
          </attribute>
          </tag>
        
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值