jsp技术:day2--jsp的几个容器、myAjax(隐藏帧技术)底层原理、jsp的三代开发技术

JSP的几个容器

容器从小到大:

pageContext–>request–>session–>application
这里我们要重点介绍这个pageContext,因为pageContext容器我们没遇到过。
通过pageContext可以很方便的操纵其他容器,如下面代码

pageContext.setAttribute("name", "pageContext-name", PageContext.PAGE_SCOPE);
            pageContext.setAttribute("name", "request-name", PageContext.REQUEST_SCOPE);
            pageContext.setAttribute("name", "session-name", PageContext.SESSION_SCOPE);
            pageContext.setAttribute("name", "application-name", PageContext.APPLICATION_SCOPE);

他等价于:

//从小到大的四个容器
            pageContext.setAttribute("name", "pageContext-name");
            request.setAttribute("name", "request-name");
            session.setAttribute("name", "session-name");
            application.setAttribute("name", "application-name");


            out.print(pageContext.getAttribute("name", PageContext.PAGE_SCOPE)+"<br/>");
            out.print(pageContext.getAttribute("name", PageContext.REQUEST_SCOPE)+"<br/>");
            out.print(pageContext.getAttribute("name", PageContext.SESSION_SCOPE)+"<br/>");
            out.print(pageContext.getAttribute("name", PageContext.APPLICATION_SCOPE)+"<br/>");

等价于下面的代码:

            out.print(pageContext.getAttribute("name")+"<br/>");
            out.print(request.getAttribute("name")+"<br/>");
            out.print(session.getAttribute("name")+"<br/>");
            out.print(application.getAttribute("name")+"<br/>");

pageContext.findAttribute()方法

这个方法会依次(从小到大的容器)
pageContext->request->session->application
去找对应的属性,找到一个后面就不会再找了

myAjax(隐藏帧技术)—定点通讯

图示myAjax(隐藏帧技术):

这里写图片描述

知识点:

1、用iframe做一个画中画,将其style设为style="display: none"name="dateFrame"
2、在所提交的表单A中,我们做一个编辑框的onblur事件,用js技术做失去焦点的时候将里面的值放到我们下面做的一个表单中。

3、在另一个表单B中,我们要设一个属性即 target="dateFrame" 这样,我们这个表单提交返回的就是这个画中画的页面,而不是浏览器的页面。实现了浏览器中的信息不动。如果不舍target 属性,默认的就是浏览器页面。
4、在表单B中,我们写一个servlet来判断是否通过,设置一个变量error,如果通过,为0,不通过为1;转发到结果页面,而这个结果因为在表单B中设置了返回页面是iframe的name="dateFrame"的,所以返回的是这个画中画页面,没有动浏览器页面。

5、在表单A中,写一个<div id="msg" style="color:red;"></div>在用户填写的属性的后面,这样,就可以及时显示改填写的值的信息是否正确。

6、在结果页面中,我们将错误信息输出,拿到上面设置的错误信息,根据错误信息去设置父页面的div属性。当然,这里可以使用一种架构:在父页面的js中自己写一个方法,由父页面去调。这种由父页面自己调用自己的方法这种架构比较好,相当于我们在监听里写代码要将外面的变量声明成final类型,这样不好,所以我们在监听里面调用外面的一个方法,这样就不用将变量声明为final类型了,使得架构更好
如图:
1、全部不隐藏:
这里写图片描述
2、隐藏表单B的显示:
这里写图片描述
3、隐藏iframe做的子页面:
这里写图片描述
至此,myAjax的底层原理就是这样。

jsp的三代开发技术

第一代jsp开发技术:纯jsp技术开发

用jsp写网页和逻辑。

jsp技术第二代:演示JSP+EJB开发技术

在pojo的基础上增加一些业务处理方法,这样就变成了企业级JavaBean。因为我们反正是在拿值对象去操作,索性将这些方法写入值对象中,这样,第二代jsp技术就出来了

jsp技术第三代:演示JSP+Servlet+POJO开发技术

分为了三层,即MVC架构思想,jsp只写html和El表达式,servlet和service操作pojo 然后去做业务逻辑,去数据层访问。这个POJO也可以称为简单的javabean
如图所示:
这里写图片描述

本文完整代码如下:

index.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
  </head>

  <body>
        <h2>演示jsp的4个容器---pageContext容器没遇到过</h2>
        <%
            //从小到大的四个容器
            //pageContext.setAttribute("name", "pageContext-name");
            //request.setAttribute("name", "request-name");
            //session.setAttribute("name", "session-name");
            //application.setAttribute("name", "application-name");
         %>
         <!-- 
            通过pageContext可以很方便的操纵其他容器,如下面代码
          -->
        <%
            //等价于上面的代码
            pageContext.setAttribute("name", "pageContext-name", PageContext.PAGE_SCOPE);
            pageContext.setAttribute("name", "request-name", PageContext.REQUEST_SCOPE);
            pageContext.setAttribute("name", "session-name", PageContext.SESSION_SCOPE);
            pageContext.setAttribute("name", "application-name", PageContext.APPLICATION_SCOPE);
         %>
         <%
            out.print(pageContext.getAttribute("name")+"<br/>");
            out.print(request.getAttribute("name")+"<br/>");
            out.print(session.getAttribute("name")+"<br/>");
            out.print(application.getAttribute("name")+"<br/>");
          %>
         <%
            //等价上面的代码
            //out.print(pageContext.getAttribute("name", PageContext.PAGE_SCOPE)+"<br/>");
            //out.print(pageContext.getAttribute("name", PageContext.REQUEST_SCOPE)+"<br/>");
            //out.print(pageContext.getAttribute("name", PageContext.SESSION_SCOPE)+"<br/>");
            //out.print(pageContext.getAttribute("name", PageContext.APPLICATION_SCOPE)+"<br/>");
          %>
          <h2>----------我是最美的分割线1111111111--------------</h2>
          <!-- pageContext.findAttribute("name")方法,会依次(从小到大的容器)
          pageContext->request->session->application
          去找对应的属性,找到一个后面就不会再找了
           -->
         <%
            out.print(pageContext.findAttribute("name")+"<br/>");
          %>
          <h2>----------我是最美的分割线1111111111--------------</h2>
          <!-- EL表达式 -->
          <h2>这里有一个name:${name}</h2>
          <h2>----------我是最美的分割线222222222--------------</h2>
          <h2>myAjax--演示隐藏帧技术--定点通讯</h2>
          <!-- 用iframe,画中画隐藏起来,结合js技术 -->
          <a href="jsps/reg.jsp">去注册</a>
          <br/>
          <br/>
          <br/>
          <br/>
          <h1>演示jsp的三代技术</h1>
          <br/>
          <br/>

          <h2>jsp技术第一代:纯jsp技术开发</h2>
          <a href="jsps/regPureJsp.jsp" >纯jsp技术做的注册</a>
          <br/>
          <br/>
          <br/>
          <h2>jsp技术第二代:演示JSP+EJB开发技术</h2>
          <%--因为我们反正是在拿值对象去操作,索性将这些方法写入值对象中,这样,第二代jsp技术就出来了 --%>
          <a href="jsps/regEjbJsp.jsp" >演示JSP+EJB开发技术做的注册</a>

          <br/>
          <br/>
          <h2>jsp技术第三代:演示JSP+Servlet+POJO开发技术</h2>
          <a href="jsps/regServletJsp.jsp">演示JSP+Servlet+POJO开发技术</a>         

          <br/>
          <br/>
          <br/>
          <br/>
          <br/>
          <br/>
          <br/>
          <br/>
          <br/>
          <br/>
  </body>
</html>

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
  <display-name></display-name>
  <servlet>
    <servlet-name>RegServlet</servlet-name>
    <servlet-class>cn.hncu.reg.servlet.RegServlet</servlet-class>
  </servlet>
  <servlet>
    <servlet-name>ValServlet</servlet-name>
    <servlet-class>cn.hncu.reg.servlet.ValServlet</servlet-class>
  </servlet>
  <servlet>
    <servlet-name>regServletPOJO</servlet-name>
    <servlet-class>cn.hncu.reg.servlet.regServletPOJO</servlet-class>
  </servlet>



  <servlet-mapping>
    <servlet-name>RegServlet</servlet-name>
    <url-pattern>/RegServlet</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>ValServlet</servlet-name>
    <url-pattern>/ValServlet</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>regServletPOJO</servlet-name>
    <url-pattern>/regServletPOJO</url-pattern>
  </servlet-mapping>    
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

doReg.jsp

<%@page import="java.io.PrintWriter"%>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
  </head>

  <body>
    <h1>处理注册界面</h1>
    <%
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");
        String name = request.getParameter("name");
        String pwd = request.getParameter("pwd");
        if(name!=null&&name.trim().length()>0&&name.startsWith("hncu")){
            //访问后台
            session.setAttribute("user", name);
            out.print("注册成功。name:"+name+",pwd:"+pwd+"<br/>");   

        }else{
            out.print("注册失败,用户名必须以hncu开头"); 

        }


     %>     
  </body>
</html>

doRegEjb.jsp

<%@page import="java.io.PrintWriter"%>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
  </head>

  <body>
    <h1>处理注册界面</h1>
    <%
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");
        String name = request.getParameter("name");
        String pwd = request.getParameter("pwd");
        if(name!=null&&name.trim().length()>0&&name.startsWith("hncu")){
            //访问后台
            session.setAttribute("user", name);
            out.print("注册成功。name:"+name+",pwd:"+pwd+"<br/>");   

        }else{
            out.print("注册失败,用户名必须以hncu开头"); 

        }


     %>     
  </body>
</html>

reg.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <script type="text/javascript">
        function val(obj){
            var nm = obj.value;
            if(nm!=null&&nm!=""){
                document.getElementById("regName").value=nm;
                document.forms[1].submit();
            }else{
                alert("请输入用户名");
            }
        }
        function resBack(res){
            if(res==1){
                parent.document.getElementById("msg").innerHTML="用户已存在,请重新输入";
            }else{
                parent.document.getElementById("msg").innerHTML="恭喜,注册成功";
            }
        }

    </script>
  </head>

  <body>
    <h1>注册界面</h1>
    <h2>演示myAjax---隐藏帧技术</h2>
    <form action="<%=request.getContextPath()%>/RegServlet" method="post">
        Name:<input type="text" name="name" onblur="val(this)" >
        <div id="msg" style="color:red;"></div>
        <br/>
        Passward:<input type="password" name="pwd" /><br/>
        <input type="submit" value="注册" />
    </form>
    <form target="dateFrame" action="<%=request.getContextPath()%>/ValServlet" method="post">
        <!-- 
        这里不用
        <input type="text" name="name" id="regName" ><br/>
        <input type="text" name="name" id="regName" ><br/>
        应该用
         <input type="hidden" name="name" id="regName"><br/>
         -->
         <input type="hidden" name="name" id="regName"><br/>
    </form>
    <!-- 
        <iframe name="dateFrame" >
    -->
         <iframe name="dateFrame" style="display: none">

    </iframe>
  </body>
</html>

regEjbJsp.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
  </head>

  <body>
    <h1>注册界面</h1>
    <h2>演示第二代jsp技术做的注册界面---JSP+EJB开发</h2>
    <form action="<%=request.getContextPath()%>/jsps/doRegEjb.jsp" method="post">
        Name:<input type="text" name="name" ><br/>
        Passward:<input type="password" name="pwd" /><br/>
        <input type="submit" value="注册" />
    </form>
  </body>
</html>

regPureJsp.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
  </head>

  <body>
    <h1>注册界面</h1>
    <h2>演示第一代jsp技术做的注册界面---纯jsp开发</h2>
    <form action="<%=request.getContextPath()%>/jsps/doReg.jsp" method="post">
        Name:<input type="text" name="name" ><br/>
        Passward:<input type="password" name="pwd" /><br/>
        <input type="submit" value="注册" />
    </form>
  </body>
</html>

regResult.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
  </head>

  <body>
    <h2>结果页面</h2>
    <%--
        错误信息:${error }
     --%>
        错误信息:${error }
    <script type="text/javascript">
        var res = '<%=request.getAttribute("error")%>';
        <%--
        if(res==1){
            parent.document.getElementById("msg").innerHTML="用户已存在,请重新输入";
        }else{
            parent.document.getElementById("msg").innerHTML="恭喜,注册成功";
        }
        --%>
        <%--
        由父页面自己调用自己的方法这种架构比较好,相当于我们在监听里写代码
        要将外面的变量声明成final类型,这样不好,所以我们在监听里面调用外面的一个方法,
        这样就不用将变量声明为final类型了,使得架构更好 
        --%>
        parent.resBack(res);
    </script>
  </body>
</html>

regServletJsp.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
  </head>

  <body>
    <h1>注册界面</h1>
    <h2>演示第三代jsp技术注册:jsp+servlet+pojo</h2>
    <form action="<%=request.getContextPath()%>/regServletPOJO" method="post">
        Name:<input type="text" name="name" /><br/>
        Passward:<input type="password" name="pwd" /><br/>
        <input type="submit" value="注册" />
    </form>
  </body>
</html>

RegServlet

package cn.hncu.reg.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class RegServlet extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        doPost(request, response);
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        response.setContentType("text/html;charset=utf-8");
        request.setCharacterEncoding("utf-8");
        PrintWriter out = response.getWriter();
        String name = request.getParameter("name");
        String pwd = request.getParameter("pwd");
        if(name.startsWith("hncu")){
            out.print("恭喜注册成功"+"用户名:"+name+",密码:"+pwd);
        }else{
            out.print("注册失败,用户名必须以hncu开头");
        }

    }

}

regServletPOJO

package cn.hncu.reg.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import cn.hncu.regServletPojo.domain.User;
import cn.hncu.regServletPojo.service.RegService;

public class regServletPOJO extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doPost(request, response);
    }
    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        User user = new User();
        String name = request.getParameter("name");
        String pwd = request.getParameter("pwd");
        user.setName(name);
        user.setPwd(pwd);
        RegService service = new RegService();
        boolean boo = service.reg(user);
        if(boo){
            //访问后台
            request.getSession().setAttribute("name", name);
            out.println("注册成功,name:"+name+",pwd:"+pwd);
            //转发页面
        }else{
            out.println("注册失败,用户名必须以hncu开头,且密码长度大于等于5.name:"+name+",pwd:"+pwd);
            //转发页面
        }

    }

}

ValServlet

package cn.hncu.reg.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ValServlet extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doPost(request, response);
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        String name = request.getParameter("name");
        String pwd= request.getParameter("pwd");
        if(name!=null&&name.trim().length()>0&&name.startsWith("hncu")){
            request.setAttribute("error", 0);//可以注册
        }else{
            request.setAttribute("error", 1);//不能注册,必须以hncu开头
        }
        request.getRequestDispatcher("/jsps/regResult.jsp").forward(request, response);
    }

}

cn.hncu.regEjb.ejb.User

package cn.hncu.regEjb.ejb;

public class User {
    private String name ;
    private String pwd;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPwd() {
        return pwd;
    }
    public void setPwd(String pwd) {
        this.pwd = pwd;
    }
    @Override
    public String toString() {
        return "User [name=" + name + ", pwd=" + pwd + "]";
    }
    //在POJO 的基础上,增加一些业务处理方法,就变成企业级javabean,也成为EJB
    public boolean reg(){
        //这里可以导入dao层的方法,,这里就不写了,
        if(name.startsWith("hncu")&& pwd.length()>4){
            return true;
        }
        return false;

    }


}

cn.hncu.regServletPojo.domain.User

package cn.hncu.regServletPojo.domain;

public class User {
    private String name;
    private String pwd;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPwd() {
        return pwd;
    }
    public void setPwd(String pwd) {
        this.pwd = pwd;
    }
    @Override
    public String toString() {
        return "User [name=" + name + ", pwd=" + pwd + "]";
    }

}

RegService

package cn.hncu.regServletPojo.service;

import java.util.ArrayList;
import java.util.List;

import cn.hncu.regServletPojo.domain.User;

public class RegService {
    public boolean reg(User user){
        if(user.getName().startsWith("hncu")&&user.getName().trim().length()>0&&user.getPwd().length()>4){
            return true;
        }
        return false;
    }
    public List<User> getAll(){
        return new ArrayList<User>();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值