JavaWeb系列之九(jsp,javabean,el表达式)

时间:2022-06-15 19:08:15

1.jsp:java server pages,java服务器端的页面
    sun公司提供开发动态网站的技术servlet jsp
    jsp会编译成servlet,会放到tomcata的work目录
    jsp的包含:html+java代码+jsp自身指令
    有三种方式:
    <%! %>
    <% %>
    <%= %>
    题目
    <%=x %>//把成员变量x的值输出
    <% x=5; %>//把成员x变量赋值为5
    <% int x = 10; %>//在service方法里面定义一个x值为10;
    <% this.x = 20; %>//把成员变量x的值赋值20
    <%=x %>//把方法里面定义的变量x输出
    <%! int x = 0; %> //定义一个成员变量x值是0
    A.0 10  B.10 20  C.0 20  D.20 0
    最终的结果是 0 10
2.jsp的注释
    jsp:java server pages,java服务器端的页面
    在jsp里面可以写html注释,可以写java注释,可以写jsp自身的注释
    三类注释在jsp执行过程中,都会有  
    <!-- --><%-- jsp的注释--%>java的三只注释
    jsp编译成seervlet之后,html存在,java注释存在,但是jsp注释就不存在
    servlet显示在页面上,html注释存在,java注释和jsp注释都没有了
    <!-- html注释 -->
    <!-- java的注释 -->
    <%
    //单行注释
    /*多行注释
    */
    /**文档注释
    */
    %>
    <!-- jsp的注释 -->
    <%--jsp的注释 --%>
3.jsp的指令
    语法:<%@ 指令的名称 属性="属性值" %>
    jsp的质量包含三个指令:
    page:设置jsp页面的信息,<%@ page 属性="属性值" %>
        page指令里面的属性:
        language:支持的语言类型,现在只有java,
        extends:jsp编译成的servlet会继承哪个类:默认HttpJspBase
        session:在jsp里面是否可以直接使用session对象,session属性值true | false
        import:倒入一个包,可以写在一起用逗号隔开
        可以分开导入包
        <%@ page import="java.util.Date"%>
        <%@ page import="java.util.ArrayList"%>
        <%@ page import="java.util.List"%>
        可以写在一起
        <%@ page import="java.util.List,java.util.ArrayList"%>
        buffer:输出的缓冲区大小 8kb;
        autoFulsh:超出缓冲区是否正常使用
        erroPage:如果当前的jsp页面出现异常,到错误页        errorPage="错误页面"
        isErroPage:在错误页面中,是否可以显示错误信息。这个属性一般是程序员调试程序时候使用,把程序给客户时候,
                    这个属性一定设置成false
                    值 true和false,默认值是false,不会生成下面的代码
                    当在错误页面中,设置这个属性的值true之后,生成的servlet里面,多出几行代码
            java.lang.Throwable exception = org.apache.jasper.runtime.JspRuntimeLibrary.getThrowable(request);
            if (exception != null) {
           response.setStatus(javax.servlet.http.HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
         }
        contentType:jsp最终编译成servlet,最终使用浏览器编码
        pageEncoding:jsp编译成servlet,设置使用的编码
        isElIgnored:jsp里面死否忽略el表达式,改成true,写el表达式,把它当成表达式
    include:jsp包含其他的jsp页面,
        jsp包含其他的jsp页面写法:<%@ include file="包含的页面">被包含的页面不需要写其他的内容,只要写包含的内容,最终只编译成一个servlet
        静态包含的过程,相当于代码复制:
       
        包含不能传递参数,不能是变量,只需要写文件内容  
    taglib:引入标签库
        替代掉<%%>写法:<%@ tagilb="标签库" prefix="标签名称"%>
 4.jsp的内置对象
    在jsp里面的可以直接使用的对象
    resquest:HttpServletRequest里面代表请求,获取提交的参数,是一个域对象,设置值和取值
    response:相当于HttpServletResponse,代表响应,向页面输出内容
    session:相当于servlet里面的HttpSession,也是域对象,范围会话
    congfig:相当于ServletConfig,获取servlet名称,获取初始化参数
    application:相当于 servlet里面servletContext,域对象,范围整个web项目,获取全局初始化参数
    exception:获取异常欣喜,getMessage方法,需要把isErrorPage设置成true
    page:当成运行的servlet对象
    out:向页面输出内容,out.write()代码,out使用的是Jspwrite对象,使用reaponse.getwrite()使用printWrite对象,也可以向页面输出
    输出机制:首先产生两个缓冲区,一个是out缓冲区,一个是response缓冲区,out不会直接输出,首先把内容放到out缓冲区,然后再放到response的缓冲区,最终通过缓冲区想页面输出
     
    pageContext:
        父类 JspContext
        pageContext:只能在jsp里面使用,servlet里面没有页面的概念
                        作用范围:当前的jsp页面
                        设置值 setAttribute(java.lang.String name, java.lang.Object value)
                        获取值 getAttribute(java.lang.String name)
        代码
        <!-- 向pageContext域里面设置值 -->
         <%
        pageContext.setAttribute("page1", "itcastpage1");
        %>
        <!-- 使用传统方式获取 -->
        <%=pageContext.getAttribute("page1") %>
        <hr/>
        <!-- 使用el表达式获取 -->
        ${page1 }
            pageContext:可以向其他域对象里面设置值
            setAttribute(name,value,scope)第一个参数:名称 第二个参数:值 第三个参数:域名称
            pageContext:可以向其他域对象里面获取值 1.${名称}就可以获取值 2.两个参数:第一个参数是域对象的名称,第二个参数是哪个域对象
            findAttribute():表示得到域对象里面最小的值
            pageContext:可以获取其他的八个内置对象  :pageContext.getSeesion
    四个域对象
        pageContext : 范围是jsp页面,这个对象只能在jsp里面使用
        request :范围一次请求,经常和转发一起使用
        session  :范围一次会话
        application:范围整个web项目
    四个域对象都使用setAttribute设置值,使用getAttribute获取值
5.jsp的动作标签
    在jsp里面有6个动作标签:
    <jsp:动态标签名称 属性="属性值"></jsp:动态标签名>
     <jsp:forward>:表示转发的操作
     - jsp:forward page="转发到路径 不要带项目名称"></jsp:forward>
     - <!-- 使用jsp里面的forward的动作标签 -->
    <jsp:forward page="/jsp/hello.jsp"></jsp:forward>
   
    <jsp:include>:表示包含
           
    <jsp:param>:表示页面传递参数
    * 代码   <!-- 使用jsp里面的forward的动作标签 -->
     <!-- 相当于在hello.jsp?id11=itcast200 -->
     <jsp:forward page="/jsp/hello.jsp">
    <jsp:param value="itcast200" name="id11"/>
     </jsp:forward>
  第二个类:操作javabean的动作标签
    <jsp:useBean>:操作哪个javabean
    <jsp:setProperty>设置javabean的属性
    <jsp:getProperty>得到javabean的属性
6.JavaBean的简介
    javabean就是一个java类,但是要遵循一定的书写规范。
    遵循的规范:必须有一个公开的没有参数的构造方法。javabean里面私有的,属性必须是通过公共方法暴露出来
    javabean的作用:存值和取值,封装数据
    使用传统方式来存取数据,
    使用jsp动作标签封装数据时候,表单输入项的name值要一样
7.javabean的内省(完成javabean的封装)
    完成javabean数据的封装
    使用到类
    Introspector:
    方法
    BeanInfo getBeanInfo(Class<?> beanClass) :得到javabean里面的内容
    参数 Class类,javabean字节码文件,
    三种方式可以得到Class类 类名.class   对象.getClass()  Class.forName("包类路径")
    BeanInfo
    PropertyDescriptor[] getPropertyDescriptors()  :得到属性描述,返回数组
    PropertyDescriptor
    Method getReadMethod()  :表示读的方法,javabean里面的getXX方法
    Method getWriteMethod()  :表示写的方法,javabean里面的setXX方法
    Method
    invoke(Object obj, Object... args) :让方法去执行
8.BeanUtil框架的使用
    作用:封装数据到javabean
    是apache组织开发的一个小型操作javabean的api
     如果想要使用beanUtils,必须要导入支持的jar包(导入两个jar包)
     web项目里面如何导入jar包
    把需要导入的jar包,复制到webroot--WEB-INF--lib目录下面,自动把jar包导入到项目中
    注意:表单输入项name的值必须要和javabean里面的属性名称要相同
    使用到的类 org.apache.commons.beanutils 下面
    BeanUtils
    populate(Object bean, Map properties):完成数据的封装
    两个参数:第一个参数是javabean对象,第二个参数表单输入的值和输入的值,map集合
    创建jsp页面,写提交表单,表单提交到servlet里面,在servlet里面使用框架实现封装数据到                javabean操作
    代码
    //得到表单提交的数据
    //创建javabe对象
    //使用框架实现封装
    Person p12 = new Person();
    try {
        BeanUtils.populate(p12, request.getParameterMap());
    } catch (Exception e) {
        e.printStackTrace();  
    }
    使用框架,如果属性的类型是基本数据类型和String类型完成封装,但是如果不是这些类型出现转换的异常
    ConvertUtils
        register(Converter converter, Class clazz)
        两个参数:第一个参数是转换器,第二个参数是转换类型Class
        String d1 = (String) o;
    //把字符串的日期类型转换成Date类型
    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
    Date date = null;
    try {
    date = format.parse(d1);
    } catch (ParseException e) {
    e.printStackTrace();
    }
    return date;
 9.el表达式
    用途:获取域对象里面的值
    语法: ${域对象的名称}
    (1)使用el表达式获取域对象的值
    代码
    <!-- 向四个域对象里面设置值 -->
    <%
    pageContext.setAttribute("itcast", "pagevalue");
    request.setAttribute("itcast", "requestvalue");
    session.setAttribute("itcast", "sessionvalue");
    application.setAttribute("itcast", "applicationvalue");
     %>
     <!-- 使用el表达式获取值 -->
     ${pageScope.itcast }
     ${requestScope.itcast }
     ${sessionScope.itcast }
     ${applicationScope.itcast }
    (2)使用el表达式获取域对象里面的数组的值
    使用数组的下标获取,如果数组的下标不存在,返回空字符串""
    代码
    <!-- 使用el表达式获取域对象里面的数组的值 -->
    <%
    String[] arr = {"tom","jack","lucy"};
    //把这个数组放到域对象里面
    request.setAttribute("arr", arr);
    %>
    <!-- 使用el表达式获取数组里面的值 -->
    ${arr[1] }
    (3)使用el表达式获取域对象里面集合里面的值
    向域对象里面放list集合
    使用集合下标获取值
    代码
    <!-- 使用el表达式获取域对象里面list的值 -->
    <%
    List list = new ArrayList();
    list.add("AAAA");
    list.add("TTTT");
    list.add("wwww");
    request.setAttribute("list", list);
     %>
     ${list[10] }
    向域对象里面map集合   
     <%
    Map map = new HashMap();
    map.put("aaa", "AAAA");
    map.put("bbb", "BBBB");
    map.put("ccc", "CCCC");
    request.setAttribute("map", map);
    %>
    ${map.aaa }
    (4)使用el表达式获取域对象里面的对象的属性的值
    代码
    <!--  使用el表达式获取域对象里面对象的属性的值-->
    <%
    Person1 p11 = new Person1();
    p11.setId("404");
    p11.setUsername("mary");
    p11.setAge("500");
    request.setAttribute("p11", p11);
     %>
    ${p11.id }
    ${p11.username }
    ${p11.age }
    (5)执行运算
    算数运算 + -
    代码
    <!-- 执行算术的操作 -->
    <%
    pageContext.setAttribute("aa", "11");
    pageContext.setAttribute("bb", "22");
    %>
    ${aa+bb }
    关系运算 > < <= >=
    逻辑运算 &&  ||
    三元运算符(三目运算)
    ${ user != null ? user.name : "" }
    ${ empty user ? user.name : "" }: empty表示空
    ${not empty user  ? user.name : "" }: not empty不是空
10、使用EL表达式操作web开发常用的对象
    el表达式里面提供了11个隐含对象
    param:得到提交的参数,相当于request.getParameter();
    paramValues: 得到多个值,相当于request.getParameterValues();
    header: 得到头信息,相当于request.getHeader();
    initParam: 得到全局的初始化参数
    pageContext:得到内置对象
     <!-- pageContext对象 -->
      ${pageContext.request }
      ${pageContext.response }