JAVA-JSP/Servlet 笔记(九)

简介: JAVA-JSP/Servlet 笔记(九)

1、如果用户禁止cookie,如何继续使用session (了解)?

    1)可以使用url重写来解决这个问题。

    2)什么是url重写

          浏览器向服务器发请求时,请求地址由服务器来生成(服务器会在请求地址后面添加 sessionId)。

    3)如何编程

         a,   response.encodeURL(String url) ;

         该方法用在链接地址,表单提交地址。比如

         <a href="<%=response.encodeURL("some")%>"></a>

         <form action="<%=response.encodeURL("del.do")%>">

         b, response.encodeRedirectURL(String url);

         该方法要用在重定向,比如

         response.sendRedirect(

         "<%=response.encodeRedirectURL("list.do")%>");

         注意:

              转发不用考虑。因为转发是服务器内部 一个组件通过容器调用另外一个组件,与 session无关。

2、prototype.js


    是一个流行的js框架,提供了很多有用的函数。

    a,  $(id):  document.getElementById(id);

    b,  $F(id):  $(id).value;

    c, $(id1,id2,id3...):  依据id1,id2...分别查找相应的节点,然后放到一个数组里面返回。

    d, strip(): 除掉字符串两端的空格。

    e, evalJSON(): 将json字符串变成javascript对象。

   

3、过滤器


    (1)过滤器是什么?

         servlet规范当中定义的一种特殊的组件,可以拦截servlet容器调用的过程并进行相应的处理。

    (2)如何写一个过滤器?

         step1 ,写一个java类,实现Filter接口。

         step2, 在doFilter方法里面,编写拦截处理代码。

         step3, 配置过滤器 (web.xml)。

    (3)过滤器的优先级

              当有多个过滤器都满足过滤的条件,容器 会按照<filter-mapping>的 先后顺序来执行过滤器。

   (4)优点

              a, 可以将多个 组件相同的处理逻辑集中写在过滤器里面,方便代码的维护。

              b, 可以实现代码的"可插拔性": 增加或者减少某个模块,不影响整个程序的

         正常执行。

4、监听器

    (1)什么是监听器

         servlet规范当中定义的一种特殊的组件, 用来监听容器产生的事件并进行相应的处理。

         主要有两大类事件:

              a, 生命周期相关的事件: 当容器创建或者销毁request,session,ServletContext(servlet上下文)时产生的事件。

              b, 绑订相关的事件:当容器调用了request, session,ServletContext的setAttribute, removeAttribute产生的事件。

    (2)如何写一个监听器

         step1, 写一个java类,实现相应的监听器接口。 (要依据监听的事件选择相应的监听器接口,比如, 要监听session的创建或者销毁,选择 HttpSessionListener)。

         step2, 实现 监听器接口方法。

         setp3,  配置监听器(注册)。

    (3)ServletContext接口

         1)servlet上下文是什么?

               当容器启动的时候,会为每一个应用创建唯一的一个符合ServletContext接口的一个对象,该对象会一直存在,除非容器关闭或者应用被卸载。

         2)如何获得servlet上下文?

              a,  GenericServlet 提供了getServletContext();

              b,  HttpSession 提供了getServletContext();

              c,  ServletConfig 提供了getServletContext();

              d,  FilterConfig 提供了getServletContext();

         3)作用

              a, 绑订数据  setAttribute,removeAttribute, getAttribute

         注意:

                   request,session,ServletContext都可以绑订数据,区别如下:

                   区别1:  绑订的时间长度不一样,request绑订的数据存在的时间是一次请求与响应期间,

                             session是多次请求与响应期间,ServletContext会一直存在。

                   区别2: request绑订的数据可以被同一个请求 当中所涉及的各个组件访问(转发)。session绑订的数据可以被多个请求所涉及的组件访问。

                              ServletContext绑订的数据可以随时访问,任何组件都可以访问。

                             尽量优先使用生命周期短的,比如,使用 request能解决问题,就不要用session。

              b,访问全局的初始化参数全局的初始化参数指的是可以 被同一个 应用中的所有的servlet,filter访问的初始化参数。String getInitParameter(String paraName);

              c, 依据逻辑路径获得实际部署时的物理路径

     

5、servlet线程安全问题

    (1)为什么说servlet会有线程安全问题?

         a, 容器在默认情况下,对于每个servlet,只有一个实例。

         b, 当有多个请求都去访问某个servlet,容器 就会产生多个线程调用servlet对象,就有可能产生线程不安全的情况(比如,多个线程去修改servlet对象的属性值)。

    (2)如何解决

              a, 使用 synchronized加锁。加锁之后对性能会有一些影响。

              b, 让servlet实现 SingleThreadModel接口。容器会为每一个线程创建一个servlet实例。  不建议使用(如果请求过多,会产生过多的servlet对象)。

6、上传文件(扩展)

    step1, 设置表单的enctype="multipart/form-data",并且,表单的提交方式必须为post。

    step2, 在服务器端,不能够使用request.getParameter方法。

    此时,要使用InputStream, request.getInputStream()获得一个字节输入流,然后分析该流获得相应的数据。一般使用一些工具来分析,比如apache提供的commons-fileupload.jar来分析。


7、jsp 标签

      (1) jsp标签

         1)jstl (java standard taglib java标准标签库,由apache提供的一些常用的标签,后来捐献给了sun,sun将这些标签命名为jstl)。

         2)编程步骤

              step1,将jstl相关的jar文件拷贝到WEB-INF\lib下。

              D:\czh\MyEclipse 5.5.1 GA\

              eclipse\

              plugins\

              com.genuitec.eclipse.j2eedt.core_5.5.1\

              data\

              libraryset\JSTL1.1\lib

              standard.jar jstl.jar

         step2, 使用taglib指令引入要使用的jsp标签<%@taglib uri="" prefix=""%>

              uri: 命名空间,就是一个字符串,用来区分同名的元素。为了保证命名空间的唯一性,经常使用一个域名来表示命名空间。

              prefix:前缀

        1、jsp标签是如何运行的?

               容器依据标签的命名空间找到标签的描述文件(容器会从WEB-INF\下查找,找不到,再查找WEB-INF\lib下的jar文件),接下来,依据标签的名称

               找到标签的描述(标签类的名称),然后将这个标签类实例化,调用其方法。

    2、jstl的核心标签

          1)if标签

         <c:if test="" var="" scope="">

              标签体

         </c:if>

         如果test属性值为true,则执行标签体的内容。

          标签体可以是html,也可以是java代码。test属性可以使用el表达式来赋值。var属性用来指定一个绑订名称 scope属性用来指定绑订的范围(page,request,session,application)

    2) choose标签

         <c:choose>

              <c:when test="">

                   标签体

              </c:when>

              ....

              <c:otherwise>

              </c:otherwise>

         </c:choose>

              when表示一个分支,当test属性值为 true时,执行该分支的内容。

              test属性可以使用el表达式。when标签可以出现1次或者多次。otherwise标签可以出现0次或者1次,表示例外。

    3) forEach标签

              遍历集合

         <c:forEach var="" items="" varStatus="">       </c:forEach>

         items属性:指定要遍历的集合,可以使用el

         表达式。

         var属性:指定一个 绑订名称,绑订范围是  pageContext,容器每一次从集合当中取一个对象然后将这个对象绑订到pageContext, 绑订名称由var属性来指定。

         varStatus属性:指定一个绑订名称,绑订范围是pageContext,绑订值是一个封装了当前迭代状态的对象。该对象有几个方法可以获得当前迭代的状态,比如

               getIndex():返回当前正在被访问的对象的下标,下标从0开始。

               getCount():返回是第几次迭代。值从1开始。

3、自定义标签

    step1, 写一个java类,继承SimpleTagSupport类。

    step2, 在doTag方法里,编写相应的处理逻辑。

    step3, 在.tld文件里面,描述标签。

         .tld文件要放在WEB-INF\下。

         <body-content>empty</body-content>

         该标签没有标签体。

         <body-content>scriptless</body-content>

         该标签可以有标签体,但是, 标签体里面不能够写java代码(即不能够写<% %>  <%= %>  <%! %>)。

         <body-content>JSP</body-content>

         标签有标签体,标签体的内容可以写java 代码。 只有复杂标签技术才支持JSP,简单标签技术只支持empty,scriptless


4、如果使用javaee5.0,如何使用el表达式和jstl标签

    javaee5.0对应的servlet规范是servlet2.5,     tomcat6.0实现了该规范。

    javaee1.4对应的servlet规范是servlet2.4,     tomcat5.5实现了该规范。

    如果要使用javaee5.0,建议使用tomcat6.0及以上版本。

    另外,如果要使用jstl标签,因为javaee5.0 已经将jstl对应的jar文件作为javaee5的核心包包含进来了,不必再拷贝相应的jar文件到 WEB-INF\lib下了。

   

8、mvc (model,view,controller)

    (1)什么是mvc?

          是一种软件架构的思想, 即将一个软件的模块按照 模型、视图、控制器来进行划分:其中,模型用来封装业务逻辑;视图用来生成表示逻辑;控制器用来
              协调模型和视图(视图要通过控制器来调用模型,模型返回的处理结果也要先交给控制器,由控制器来选择合适的视图来显示处理结果)。

         使用mvc最重要的原因是可以实现"模型的复用“:

         一方面,模型不用关心处理结果如何展现,只需要将处理结果交给不同的视图来展现即可(即将模型返回的结果用不同的方式来展现);另外一方面,模型可以使用不同的视图来访问。

    (2)如何使用mvc来开发一个web应用程序

         1)使用 servlet或者filter来充当控制器 ,  使用 java类来充当模型 , 使用jsp来充当视图 。

         注意:

              模型也可以使用一些企业级的java组件.   比如,ejb,spring容器管理的javabean来实现。     视图也可以使用jsf,模板技术来实现。

    (3)mvc的优点

         1) 可以实现“模型的复用” 。

         2 )系统的维护性更好 :比如添加一个视图或者修改视图不会影响模型;反过来,修改或者添加新的模型,也不会影响视图。

         3) 方便测试 :比如,如果将业务处理代码直接写在servlet里面,需要部署之后才能测试;而写在java类里面,可以立即测试(不依赖servlet容器)。

    (4)mvc的缺点

         使用mvc, 会增加代码量、相应地也会增加。           软件开发的成本,设计的难度也会增加。        

       

相关文章
|
2月前
|
Java 开发工具 Android开发
Kotlin语法笔记(26) -Kotlin 与 Java 共存(1)
本系列教程笔记详细讲解了Kotlin语法,适合需要深入了解Kotlin的开发者。若需快速学习Kotlin,建议查看“简洁”系列教程。本期重点介绍了Kotlin与Java的共存方式,包括属性、单例对象、默认参数方法、包方法、扩展方法以及内部类和成员的互操作性。通过这些内容,帮助你在项目中更好地结合使用这两种语言。
53 1
|
2月前
|
Java 开发工具 Android开发
Kotlin语法笔记(26) -Kotlin 与 Java 共存(1)
Kotlin语法笔记(26) -Kotlin 与 Java 共存(1)
37 2
|
22天前
|
安全 Java 编译器
Kotlin教程笔记(27) -Kotlin 与 Java 共存(二)
Kotlin教程笔记(27) -Kotlin 与 Java 共存(二)
|
22天前
|
Java 开发工具 Android开发
Kotlin教程笔记(26) -Kotlin 与 Java 共存(一)
Kotlin教程笔记(26) -Kotlin 与 Java 共存(一)
|
29天前
|
Java 编译器 Android开发
Kotlin教程笔记(28) -Kotlin 与 Java 混编
Kotlin教程笔记(28) -Kotlin 与 Java 混编
32 2
|
22天前
|
Java 数据库连接 编译器
Kotlin教程笔记(29) -Kotlin 兼容 Java 遇到的最大的“坑”
Kotlin教程笔记(29) -Kotlin 兼容 Java 遇到的最大的“坑”
39 0
|
1月前
|
安全 Java 编译器
Kotlin教程笔记(27) -Kotlin 与 Java 共存(二)
Kotlin教程笔记(27) -Kotlin 与 Java 共存(二)
|
1月前
|
Java 开发工具 Android开发
Kotlin教程笔记(26) -Kotlin 与 Java 共存(一)
Kotlin教程笔记(26) -Kotlin 与 Java 共存(一)
|
1月前
|
Java 编译器 Android开发
Kotlin教程笔记(28) -Kotlin 与 Java 混编
Kotlin教程笔记(28) -Kotlin 与 Java 混编
|
1月前
|
Java 编译器 Android开发
Kotlin教程笔记(28) -Kotlin 与 Java 混编
Kotlin教程笔记(28) -Kotlin 与 Java 混编
13 0