jsp--三大页面指令--六大动作--九大默认对象

2 篇文章 0 订阅
1 篇文章 0 订阅

jsp3大页面指令

位置: 可以写在JSP页面的任意位置
格式: <%@ 指令名称 若干属性声明%>
out.println(errValue);
}
}
%>
调用<% this.printError(“username”,request,out);%>
page指令 --用来声明当前JSP页面的基本属性

<%@ page language="java" %> -- 指定当前JSP使用的语言是java
<%@ page pageEncoding="UTF-8"%> -- 用来通知JSP解析引擎使用指定的编码来翻译JSP
注意:如果想防止JSP乱码,应该要保证JSP文件保存时的编码和pageEncoding指定的编码保持一致
<%@ page session="true"%> -- 用来指定当前页面是否使用session,如果设置为true,
则翻译过来的servlet中将会有对session对象的引用,于是可以直接在JSP中使用session隐式对
象;
但是这将导致一旦访问JSP就会调用request.getSession()方法,可能导致不必要的空间浪费;
如果确定JSP中不需要session可以设为false<%@ page errorPage="filepath"%> -- 为当前JSP页面指定友好错误提示页面,即当前JSP如果
抛出了异常,将会跳转到errorPage属性指定的页面。
扩展:JSP提示信息设置
如果整个WEB应用很多JSP都需要指定错误提示页面,如果挨个为每一个JSP通过errorPage来指定,非
常繁琐,所以推荐在web.xml文件中为整个网站的异常统一配置友好错误提示页面
<%@ page import="..."%> 为JSP翻译后的servlet指定所依赖的jar包
<%@page import="java.util.Date"%>

include用于实现页面静态包含
格式: <%@ include file = “head.jsp”%>
taglib用于导入tld自定义标签库
在JSP开发中就是在HTML代码中嵌入了大量的Java代码,这样一来使JSP页面充满了Java程序,维护起来
非常不方便,那么此时就可以通过标签来完成。

jsp六大动作

  • jsp:include 在页面被请求的时候引入一个文件
  • jsp:useBean 寻找或者实例化一个JavaBean
  • jsp:setProperty 设置JavaBean的属性
  • jsp:getProperty 输出某个JavaBean的属性
  • jsp:forward 把请求转到一个新的页面
  • jsp:plugin 根据浏览器类型为Java插件生成OBJECT或EMBED标记。

动态包含

可以包含静态也可以包含动态

<jsp:include>

问题1:动态包含和静态包含的区别

请求转发

<jsp:forward page="head.jsp"/>

操作javabean

<jsp:useBean>标签表示用来在JSP页面中创建一个bean实例并指定它的名字以及作用范围。

  • class指定Bean的完整包名,会在指定的scope中进行查找,如果有则重用,如果没有则自动创建
  • type指定将引用该对象变量的类型,会在指定的scope中进行查找,如果有则重用,如果没有则异常InstantiationException
<jsp:useBean id="user1" class="com.yan.entity.User">  相当于user1=new User()
  <jsp:setProperty name="user1" property="*"/>  相当于按照提供的参数名称对应将提交数据注入到user1对象中,如果需要会自动进行数据类型转换
</jsp:useBean>
<jsp:getProperty name="user1" property="password"/>  相当于user1.getPassword()

使用<jsp:useBean>时不能和当前页面中定义的临时变量冲突,创建的对象可以直接使用<%=user1%>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jntNIdMW-1654739807250)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220607102450455.png)]

默认存储范围为page,可以使用9大默认对象的<%=pageContext.getAttribute("user1")%>

<jsp:getProperty>标签表示获取bean的属性的值并将之转化为一个字符串,然后将其插入到输出的页面中。

<jsp:setProperty>标签表示用来设置bean中的属性值。

<jsp:setProperty name="user1" property="*"/>
 
<jsp:setProperty name="user1" property="password" param="pwd" />  user1.setPassword(request.getParameter("pwd"))
 
<jsp:setProperty name="user1" property="username" value="abcd"/>  user1.setUsername('abcd')

应用applet

<jsp:plugin>标签表示执行一个applet或Bean,有可能的话还要下载一个Java插件用于执行它。

地址参数

<jsp:include page="ff3.jsp">
    <jsp:param name="username" value="bbbc"/>   相当于想request的parameter中添加数据
    <jsp:param name="password" value="11111"/>
</jsp:include>

<jsp:forward page="ff3.jsp">
    <jsp:param name="username" value="bbbc"/>
    <jsp:param name="password" value="11111"/>
</jsp:forward>

jsp九大默认对象

1、request

HttpServletRequest接口类型,用于封装用户请求信息

<body>
<%
    Enumeration<String> enumeration=request.getHeaderNames();
    while(enumeration.hasMoreElements()){
        String name=enumeration.nextElement();
        String value=request.getHeader(name);  //getDateHeader  getIntHeader
        out.println(name+"--->"+value+"<br/>");
    }
%>
<hr/>
<%
    Enumeration<String> enumeration1=request.getParameterNames();
    while(enumeration1.hasMoreElements()){
        String name=enumeration1.nextElement();
        //String value=request.getParameter(name);
        String[] values=request.getParameterValues(name);
        out.print(name+"-->"+ Arrays.toString(values));
    }
%>
<hr/>
<%
    Enumeration<String> enumeration2=request.getAttributeNames();
    while(enumeration2.hasMoreElements()){
        String name=enumeration2.nextElement();
        Object value=request.getAttribute(name);
        out.println(name+"-->"+value);
    }
%>

getRemoteAddr():String

getMethod():String

请求转发request.getRequestDispatcher('目标url').forward(request,response)

动态包含request.getRequestDispatcher('被包含的url地址').include(request,response)

2、response

HttpServletResponse接口类型,用于封装服务器的响应信息

  response.setContentType("text/html;charset=UTF-8"); // MIMIE  @page contentType="text/html;charset=utf-8"
  response.setHeader("cache-control","no-cache");//避免客户端缓存的解决方案
  //response.setStatus(404);  //设置响应状态码 1xx 2xx 3xx 4xx 5xx
  //response.sendError(500,"报错信息");  设置报错状态
  //response.sendRedirect("http://www.baidu.com");重定向
  PrintStream pw=response.getWriter();
  ServletOutputStream oos=response.getOutputStream();

面试题:请求转发和重定向之间的区别

3、config

ServletConfig接口类型,用于封装当前页面的配置信息 web.xml

<%
  Enumeration<String> enumeration=config.getInitParameterNames();
  while(enumeration.hasMoreElements()){
    String name=enumeration.nextElement();
    String value=config.getInitParameter(name);
    out.println(name+"::"+value +"<br/>");
  }
%>

web.xml初始化参数配置

<servlet>
        <servlet-name>config</servlet-name>
        <jsp-file>/config.jsp</jsp-file>
        <init-param>
            <param-name>name</param-name>
            <param-value>yanjun</param-value>
        </init-param>
        <init-param>
            <param-name>age</param-name>
            <param-value>18</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>config</servlet-name>
        <url-pattern>/aaa.jsp</url-pattern>
    </servlet-mapping>

注意:参数有效的前提是必须通过配置的映射路径进行访问。例如通过aaa.jsp访问则可以获取参数,如果使用原始名称config.jsp则没有配置参数

config.getServletName():String 获取配置的名称,对应<servlet-name>
config.getServletContext():ServletContext 获取当前应用中的application对象

4、page

Object类型,用于指代当前jsp页面对象,相当于this,但是注意是Object类型

<%
    this.aaa();  //但是如果使用page.aaa()则语法报错
%>
  • equals
  • toString
  • hashcode
  • getClass
  • wait
  • notify/notifyAll
<%! 
private String aaa(){
    return "bbbb";
}
public String toString(){
    return "this is test page.jsp";
}
%>
<body>
<%
    this.aaa();  //但是如果使用page.aaa()则语法报错
    out.println(page);
%>

5、out

JspWriter类型,是服务器向客户端输出信息的字符流,也可以通过response进行获取(PrintWriter)

  • print(object)
  • println(object) 不等价于在html显示中的换行
out.print(new Date()+"<br/>");   <br/>是html中的显示换行标签
  • close()

  • flush()

  • getBufferSize() / getRemaining()

    <%@ page buffer="8kb/none" autoFlush="true" %>
    

6、exception

Throwable类型,用于封装异常信息

使用的前提:当前页面必须设置<%@ page isErrorPage=”true”%>才能使用,否则报错

方法:

  • printStackTrace()输出调用栈

    在页面上输出调用栈<%exception.printStackTrace(new PrintWriter(out)); %>

  • getMessage():String 输出异常对象

页面1:可能会产生异常的页面

<%@ page errorPage="ex02.jsp" %>

<%
  int k=0;
  out.println(10/k);
%>

页面2:获取页面1中产生的异常,并实现打印显示

<%@ page isErrorPage="true" %>

<%=exception.toString()%>  显示内容java.lang.ArithmeticException: / by zero
<hr/>
<%=exception.getMessage()%>  显示内容/ by zero
<hr/>
<% exception.printStackTrace(new PrintWriter(out)); %>  在当前页面中输出异常调用栈

7、session

HttpSession接口类型,用于实现服务器端跟踪用户,一个用户对应一个session对象

  • 获取session对象 request.getSession() / getSession(boolean)
  • 常用方法
    • setAttribute(String,Object)
    • getAttribute(String):Object
    • removeAttribute(String)
    • getAttributeNames():Enumeration

验证码

public class PicServlet extends HttpServlet {
    private int width = 120, height = 40;
    private String source = "1234567890";

    @Override
    public void init() throws ServletException {
        String ss = this.getServletConfig().getInitParameter("source");
        if (ss != null && ss.trim().length() > 0)
            source = ss;
    }
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("image/jpeg");
        OutputStream os=response.getOutputStream();
        BufferedImage bufferedImage=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
        Graphics graphics = bufferedImage.getGraphics();
        graphics.setColor(Color.black);
        graphics.setFont(new Font("黑体",Font.BOLD,25));
        String checkcode=this.generateCheckCode(6);
        graphics.drawString(checkcode,10,height-10);
        graphics.dispose();
        ImageIO.write(bufferedImage,"jpeg",os);
        os.flush();
        os.close();
    }
    private String generateCheckCode(int len){
        char[] arr=new char[len];
        Random random=new Random();
        for(int i=0;i<len;i++){
            arr[i]=source.charAt(random.nextInt(source.length()));
        }
        return new String(arr);
    }
}

web.xml

<servlet>
        <servlet-name>picServlet</servlet-name>
        <servlet-class>com.yan.action.PicServlet</servlet-class>
        <init-param>
            <param-name>source</param-name>
            <param-value>abcdefghijklmnopqrstuvwxyz</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>picServlet</servlet-name>
        <url-pattern>/pic.do</url-pattern>
    </servlet-mapping>

jsp中使用验证码

<form action="login.do" method="post">
	<input name="checkcode"/>
	<img src="pic.do"/>
  	<input type="submit" value="验证码的使用"/>
</form>

问题:如何在Servlet中判断用户输入的验证码是否正确?

  • 在PicServlet中生成checkcode后将其存储在session中

    String checkcode=this.generateCheckCode(6);
    
    HttpSession session=request.getSession();
    session.setAttribute("checkcode",checkcode);
    
  • 在LoginServlet中首先接收客户端提交的数据,同时从session中获取PicServlet存储的数据,然后进行比对

    public class LoginServlet extends HttpServlet {
     @Override
     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
         //判断验证码输入是否正确
         String checkcode=request.getParameter("checkcode"); //接收客户端提交的数据<input name=checkcode/>
         HttpSession session=request.getSession();
         Object obj=session.getAttribute("checkcode");  //获取PicServlet中在session存储的数据
         session.removeAttribute("checkcode");
         Map<String,String> errs=new HashMap<>();
         if(checkcode==null || !checkcode.equals(obj))
             errs.put("checkcode","验证码错误!");
         if(!errs.isEmpty()){
             request.setAttribute("errors",errs);
             request.getRequestDispatcher("login.jsp").forward(request,response);
             return;
         }
         ... ...
     }
    }
    

session自动支持激活钝化操作

  • 按照LRU最近最少使用原则进行管理。
  • 由于使用的是对象流,所以放入session的对象应该实现Serializable接口
  • 超时销毁机制

识别用户 session.getId()

  • session的具体实现

    Cookie: JSESSIONID=F36EEB0F9CEA6DCB81C1AFBCCEABC903

jsp页面配置 <%@ page session=true %>

session的配置 web.xml tomcat默认30分钟

<!--- web.xml配置 -->
<session-config>
	<session-timeout>30</session-timeout>
</session-config>

如果考虑针对用户友好可以设置的较长些,如果需要安全性高则可以设置较短

基本操作方法

<%
  session.setAttribute("now",new Date());  //存储数据
  out.println(session.getAttribute("now"));//获取指定key对应的数据
  session.removeAttribute("now");//移除指定key对应的存储数据

  //遍历所有的attribute
  Enumeration<String> keys=session.getAttributeNames();
  while(keys.hasMoreElements()){
    String key=keys.nextElement();
    Object val=session.getAttribute(key);
    out.println(key+"-->"+val+"<br/>");
  }

  out.println(session.getCreationTime());//获取创建时间
  out.println(session.getLastAccessedTime());//获取最近的访问时间
  out.println(session.getMaxInactiveInterval());//获取最大的不活跃时间设置,单位为秒
%>

编码: session.invalidate() 安全退出操作

8、application

ServletContext接口类型,是当前应用的上下文对象,可以实现跨用户数据共享

  • setAttribute(String,Object)
  • getAttribute(String):Object
  • removeAttribute(String)
  • getAttributeNames():Enumeration

application.getResourceAsStream("upload/" + ss):InputStream 这个输入流可以用于直接读取参数指定的文件

public class DownloadServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setHeader("Content-disposition", "attachment;filename=123.jpg");//设置浏览器以附件的方式打开响应流中的数据,filename是默认下载的文件名称
        ServletOutputStream sos = response.getOutputStream();
        ServletContext application=this.getServletContext(); //获取application对象
        InputStream inputStream = application.getResourceAsStream("upload/aaa.jpg");
        byte[] buffer = new byte[8192];
        int len = 0;
        while ((len = inputStream.read(buffer)) > 0)
            sos.write(buffer, 0, len);
        sos.flush();
        sos.close();
    }
}

使用系统日志记录信息

 try{
        int k=0;
        out.println(10/k);
} catch (Exception e){
        //application.log(e.getMessage());
        application.log("index.jsp",e);
}

上下文参数配置,有效范围在当前应用内部,可以通过application.getInitParameter进行获取

<!-- web.xml配置 -->
<context-param>
        <param-name>title</param-name>
        <param-value>闫氏集团</param-value>
</context-param>

获取上下文配置参数application.getInitParameter("title")

9、pageContext

pageContext对象是javax.servlet.jsp.PageContext类的实例对象,用来代表整个JSP页面。它代表页面上下文,该对象主要用于访问 JSP 之间的共享数据,使用pageContext可以访问page、request、session、application范围的变量。JSP页面中只需将pageContext对象传递给某个Java类的实例对象,在该Java对象中就可以访问和调用其他隐式对象的功能了。

  • JspWriter getOut(); //返回当前客户端响应被使用的JspWriter流(out)

  • HttpSession getSession(); //返回当前页面中HttpSession对象(session)

  • Object getPage(); //返回当前页面的Object对象(Object)

  • ServeletRequest getRequest(); //返回当前页面的ServletRequest对象(request)

  • ServeletResponse getResponse(); //返回当前页面的ServletResponse对象(response)

  • getException()返回exception隐式对象

  • getServletConfig()返回config隐式对象

  • getServletContext()返回application隐式对象

  • void setAttribute(String name,Object attribute); //设置属性及属性值

  • void getAttribute(String name,int scope); //在指定范围内取属性的值

  • int getAttributeScope(String name); //返回某属性的作用范围

  • void forward(String relativeUrlPath); //使当前页面重导到另一页面

  • void include(String relativeUrlPath); //在当前位置包含另一文件

JSP四大作用域

<jsp:useBean id="user" class="com.yan.UserBean" scope="request"/>

request.setAttribute("user",new UserBean());

  • page,他只在当前页面有效,也就是用户请求的页面有效,当当前页面关闭或转到其他页面时,page对象将在响应回馈给客户端后释放pageContext
  • request,他在当前请求中有效,request可以通过setAttribute()方法实现页面中的信息传递,也可以通过forward()方法进行页面间的跳转,需要注意的是request是转发不是重定向,转发相对于浏览器来说是透明的,也就是无论页面如何跳转,地址栏上显示的依旧是最初的地址
  • session,他在当前回话中有效。当一个台电脑上的同一浏览器对服务器进行多次访问时,在这多次访问之间传递的信息就是session作用域的范围。它从浏览器发出第一个HTTP请求即可认为会话开始,但是会话结束的时间是不确定的,因为在浏览器关闭时并不会通知服务器,一般Tomcat设置的默认时间为30分钟,也可以通过setMaxInactiveInterval(int)方法进行设置,或是通过invalidate()方法强制结束当前会话
  • application,他在所有的应用程序中都有效,也就是当服务器开始到服务器结束这段时间,application作用域中存储的数据都是有效的,同样可以通过setAttribute赋值和getAttribute取值。

Servlet和JSP的区别

jsp经编译后就变成了Servlet。JSP的本质就是Servlet,JVM只能识别java的类,不能识别JSP的代码,Web容器将JSP的代码编译成JVM能够识别的java类。Servlet中的内置对象都是必须通过HttpServletRequest对象、HttpServletResponse对象以及HttpServlet对象得到.Jsp是Servlet的一种简化,使用Jsp只需要完成程序员需要输出到客户端的内容,Jsp中的Java脚本如何镶嵌到一个类中,由Jsp容器完成。而Servlet则是个完整的Java类,这个类的Service方法用于生成对客户端的响应。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值