.Net转Java自学之路—基础巩固篇二十七(JSP、JavaBean、内省)

时间:2022-12-13 19:48:17

JSP:

   全称:Java Servlet Pages

  JSP和Servlet分工:

    JSP:作为请求发起页面、请求结束页面。

    Servlet:作为请求中处理数据的环节。

  JSP = html + java脚本 + jsp标签(指令)

  JSP中无需创建即可使用的对象一共有九个,被称为九大内置对象。

  九大内置对象

    out:JspWriter,等同于response.getWriter(),用来向客户端发送文本数据。

    config:ServletConfig

    page:当前JSP页面的this,即当前对象。

    pageContext:PageContext,页面上下文对象。

    exception:Throwable,只有在错误页面中可以使用这个对象。

    request:HttpServletRequest

    response:HttpServletResponse

    application:ServletContext

    session:HttpSession 。若JSP页面中有<%@page session="false" %>,则该页面不能使用session

  三种Java脚本:

    <% ... %>:Java代码。

    <%=... %>:Java表达式,用于输出(常量、变量、表达式)的结果

    <%!... %>:声明。创建类的成员变量和成员方法。

  原理:

    JSP其实就是一个特殊的Servlet。

    当JSP页面第一次被访问时,服务器会把JSP编译成Java文件,这个Java文件其实就是一个Servlet类。然后把Java编译成.class。然后创建该类对象,最后调用它的service()方法。第二次请求同一JSP时,直接调用service()方法。

    在tomcat的work目录下可以找到JSP对应的.java源文件。

  JSP注释:

    <%-- --%>:当服务器把JSP编译成Java文件时已经忽略了注释部分。

  指令:

    一个JSP页面可以有0~N个指令的定义。

    JSP的三大指令:page、include(静态包含)、taglib(导入标签库)

    page:

      格式:

<%@page 属性名称="属性值" %>

      pageEncoding和contentType的作用:

        pageEncoding:指定当前页面的编码,在服务器要把JSP编译成.java时需要使用pageEncoding

        contentType:标志添加一个响应头Content-Type。等同于response.setContentType("text/html;charset=utf-8");

        若俩个属性只提供一个,那么另一个默认值为设置的那一个。若俩个属性都没有提供,那么默认为iso

      import:导包,可以出现多次。

      errorPage和isErrorPage的作用:

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

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

        web.xml也可以指定错误页面,使用<error-page>,而<error-page>有俩种使用方式:

<error-page>
    <error-code></error-code>
    <location></location>
</error-page>
<error-page>
    <exception-type></exception-type>
    <location></location>
</error-page>

        error-code:指定响应码。404、500等。

        location:指定转发页面。

        exception-type:指定抛出的异常类型。

      autoFlush和buffer:

        autoFlush:指定JSP的输出流缓冲区满时,是否自动刷新,默认为true。若为false,那么缓冲区满时会抛出异常。

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

      isElIgnored:是否忽略EL表达式,默认为false,不忽略,即支持。

      pageContext:Servlet中有三大域;而JSP中有四大域,pageContext就是最后一个域对象。

        四大域:

          ServletContext:作用于整个应用程序。

          session:作用于整个会话,一个会话中只有一个用户。

          request:作用于一个请求链。

          pageContext:作用于一个JSP页面。

        该域是在当前JSP页面和当前JSP页面中使用的标签之间共享数据。

        功能:

          1、域对象;

          2、代理其他域:pageContext.setAttribute("xxx","XXX",PageContext.SESSION_SCOPE);

          3、全程查找:pageContext.findAttribute("xxx");依次在page、request、session、application四个域范围内查找名称为xxx的数据。page优先级最高。

          4、获取8个内置对象:

JSPWriter getOut();//获取out内置对象
ServletConfig getServletConfig();//获取config内置对象
Object getPage();//获取page内置对象
ServletRequest getRequest();//获取request内置对象
ServletResponse getResponse();//获取response内置对象
HttpSession getSession();//获取session内置对象
ServletContext getServletContext();//获取application内置对象
Exception getException();//获取exception内置对象

    include:

      静态包含。与requestDispatcher的include()方法功能相似。

      <%@include%>:它是在JSP编译成Java文件时完成的。他们共同生成一个Java文件(就是一个Servlet),然后再生成一个class。

      requestDispatcher的include()时一个方法,包含和被包含的时俩个Servlet,即俩个class;他们只是把响应的内容再运行时合并了。

      作用:

        把页面分页了,使用包含的方式组合再一起,这样一个页面中不变的部分,就是一个独立的JSP,而我们只需要处理变化的页面。

    taglib:导入标签库

      俩个属性:prefix、uri

      prefix:指定标签库在本页面的前缀,由我们自定义前缀名。

      uri:指定标签库的位置。<%@taglib prefix="pre" uri="/xxx-tags"%>

        前缀的用法实例:<pre:text>

  JSP动作标签:

    JSP的动作标签与html提供的标签由本质的区别。动作标签是由tomcat来解释执行。html由浏览器来执行。

    <jsp:forward>:转发;与requestDispatcher的forward()是一样的,一个是在Servlet中使用,一个是在JSP中使用。

    <jsp:include>:包含;与requestDispatcher的include()是一样的,一个是在Servlet中使用,一个是在JSP中使用。

    <jsp:param>:用来作用forward和include的子标签,用来给转发或包含的页面传递参数。

  自动重新加载设置:

    tomcat>>conf>>context.xml中元素Context的reloadable属性设置为true

    <Context reloadable="true">

    reloadable:重新加载。

JavaBean:

   规范:

    必须要为成员提供get/set方法。两者只提供一个也是可以的。

    必须有默认构造器(无参的)

    一般对应具有get/set方法的成员变量称之为属性。

    其实就算一个属性没有对象的成员变量,只有get/set方法也是可以的。其实属性名称就是get/set方法去除get/set后,再把首字母小写。

内省:

   内省类>>bean信息>>属性描述符>>属性的get/set对象的Method>>反射

  commons-beanutils 它依赖内省完成。内省依赖反射

  工具包:commons-beanutils.jar、commons-logging.jar

BeanUtils.setProperty(bean,name,value);//设置属性值
String BeanUtils.getProperty(bean,name);//获取属性值
BeanUtils.populate(Map,Object);
CommonUtils.toBean(map,Object);//封装数据


//例:封装表单数据到自定义对象中
ClassName cn=CommonUtils.toBean(request.getParameterMap(),ClassName.class);

实例:将一个Map封装到一个bean中

Map<String,String> map=new HashMap<String,String>();
map.put("uname","zhangsan");
map.put("pwd","123456");

User us=new User();
BeanUtils.populate(us,map);
//
User us=toBeans(map,User.class);


public static <T> T toBeans(map,Class<T> clazz){
    try{
        T bean=clazz.newInstance();//创建指定类型的javabean对象
        beanUtils.populate(bean,map);//把数据封装到javabean中
        return bean;
    }catch(Exception ex){
        throw new RuntimeException(ex);
    }
}

  JSP中与javaBean相关的标签:

    <jsp:userBean>:创建或查询bean 。

      <jsp:userBean id="user" class="包名" scope="session">

      在session域中查找名为user的bean,若不存在,创建之。

    <jsp:setproperty>:设置

      <jsp:setproperty property="uname" name="user" value="admin">

      设置名为user的这个javaBean的uname属性值为admin 。

    <jsp:getProperty>:获取

      <jsp:getProperty property="uname" name="user">

      获取名为user的javaBean的名为uname属性值