0%

2017年9月11日 下午5:40

概述

  1. 目的:其实就是取代jsp,为了让页面看起来更加整齐
  2. 这里的内容基本不用记,把下面说的重点记住就行了,其他不用记
  3. 注意
    1. 区分大小写
    2. el表达式.txt
      jstl.txt

EL表达式

核心重点:

  1. EL用来代替<%=…%>
  2. EL操作四大域的内置对象:它们是Map类型,用来代替jsp的内置对象
    1. pageScope
    2. requestScope
    3. sessionScope
    4. applicationScope
  3. EL函数库
    1. <%@taglib prefix=”fn” uri=”http://java.sun.com/jsp/jstl/functions" %>
    2. 处理字符串用
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
      49
      50
      51
      52
      53
      54
      55
      56
      57
      58
      59
      60
      61
      62
      63
      64
      65
      66
      67
      68
      69
      70
      71
      72
      73
      74
      75
      76
      77
      78
      79
      80
      81
      82
      83
      84
      85
      86
      87
      88
      89
      90
      91
      92
      93
      94
      95
      96
      97
      98
      99
      100
      101
      102
      103
      104
      105
      106
      107
      108
      109
      110
      111
      112
      113
      114
      115
      116
      117
      118
      119
      120
      121
      122
      123
      124
      125
      126
      127
      128
      129
      130
      131
      132
      133
      134
      135
      136
      137
      138
      139
      140
      141
      142
      143
      144
      145
      146
      147
      148
      149
      150
      151
      152
      153
      154
      155
      156
      EL:Expression Language,它是可以在JSP页面中直接使用的语言!
      JSP页面也可以忽略EL:<@page isELIgnored="true"%>
      EL用来代替<%=...%>


      --------------------

      格式:${...},例如:${1 + 2},会在页面上输出3

      --------------------

      运算符:+ - * / % == != < > <= >= && ! || empty
      ${empty ""} --> 输出true,判断集合、数据、字符串长度是否为0

      ${null},不会输出!如果是null不输出!

      --------------------

      EL内置对象

      EL一共11个内置对象

      EL操作四大域的内置对象:它们是Map类型
      pageScope
      requestScope
      sessionScope
      applicationScope



      ${pageScope.user}:输出pageContext.getAttribute("user")
      ${requestScope.user}:输出request.getAttribute("user");
      ${sessionScope.user}:输出session.getAttribute("user");
      ${applicationScope.user}:输出application.getAttribute("user");

      ${user}
      依次在pageScope、requestScope、sessionScope、applicationScope中查找user
      如果查找到,那么立刻停止查找。

      el表达式的默认取值查找方式是全域查找 按作用域范围从小到大依次查找 找到一个对应的键值对之后立即停止查找并显示
      如果加上对应的域范围查找 那么是指定域查找 只在指定作用域查找对应的键值对 有则显示 无则显示null

      -----------


      操作JavaBean

      ${pageScope.user.username}
      ${pageScope.user.password}

      -----------

      操作List


      ${pageScope.list[0].username}
      ${pageScope.list[0].password}

      -----------

      操作Map



      ${pageScope.map.u1.username}
      ${pageScope.map.u1.password}


      ------------------

      应用初始化参数内置对象:Map类型
      initParam:Map<String,String>

      用来获取web.xml文件中的<context-param>参数,例如:

      web.xml
      <context-param>
      <param-name>p1</param-name>
      <param-value>v1</param-value>
      </context-param>

      ${initParam.p1}

      ------------------

      与Cookie相关的内置对象:Map类型
      cookie:Map<String,Cookie>,其中key是Cookie的名称,而值是Cookie对象

      ${cookie.jsessionid.value}:获取sessionid


      ------------------

      EL中最重要的就是操作四大域!


      ==========================
      ==========================
      ==========================

      EL函数库

      EL函数库,当前就是一些函数了。

      使用EL函数库需要在JSP页面中导入标签库:


      <%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>

      String[] strs = {"a", "b","c"};
      List list = new ArrayList();
      list.add("a");
      pageContext.setAttribute("arr", strs);
      pageContext.setAttribute("list", list);
      %>
      ${fn:length(arr) }<br/><!--3-->
      ${fn:length(list) }<br/><!--1-->
      ${fn:toLowerCase("Hello") }<br/> <!-- hello -->
      ${fn:toUpperCase("Hello") }<br/> <!-- HELLO -->
      ${fn:contains("abc", "a")}<br/><!-- true -->
      ${fn:containsIgnoreCase("abc", "Ab")}<br/><!-- true -->
      ${fn:contains(arr, "a")}<br/><!-- true -->
      ${fn:containsIgnoreCase(list, "A")}<br/><!-- true -->
      ${fn:endsWith("Hello.java", ".java")}<br/><!-- true -->
      ${fn:startsWith("Hello.java", "Hell")}<br/><!-- true -->
      ${fn:indexOf("Hello-World", "-")}<br/><!-- 5 -->
      ${fn:join(arr, ";")}<br/><!-- a;b;c -->
      ${fn:replace("Hello-World", "-", "+")}<br/><!-- Hello+World -->
      ${fn:join(fn:split("a;b;c;", ";"), "-")}<br/><!-- a-b-c -->

      ${fn:substring("0123456789", 6, 9)}<br/><!-- 678 -->
      ${fn:substring("0123456789", 5, -1)}<br/><!-- 56789 -->
      ${fn:substringAfter("Hello-World", "-")}<br/><!-- World -->
      ${fn:substringBefore("Hello-World", "-")}<br/><!-- Hello -->
      ${fn:trim(" a b c ")}<br/><!-- a b c -->
      ${fn:escapeXml("<html></html>")}<br/> <!-- <html></html> -->


      ====================

      String toUpperCase(String input):把参数转换成大写
      String toLowerCase(String input):把参数转换成小写
      int indexOf(String input, String substring):从大串,输出小串的位置!
      boolean contains(String input, String substring):查看大串中是否包含小串
      boolean containsIgnoreCase(String input, String substring):忽略大小写的,是否包含
      boolean startsWith(String input, String substring):是否以小串为前缀
      boolean endsWith(String input, String substring):是否以小串为后缀
      String substring(String input, int beginIndex, int endIndex):截取子串
      String substringAfter(String input, String substring):获取大串中,小串所在位置后面的字符串
      substringBefore(String input, String substring):获取大串中,小串所在位置前面的字符串
      String escapeXml(String input):把input中“<”、">"、"&"、"'"、""",进行转义
      String trim(String input):去除前后空格
      String replace(String input, String substringBefore, String substringAfter):替换
      String[] split(String input, String delimiters):分割字符串,得到字符串数组
      int length(Object obj):可以获取字符串、数组、各种集合的长度!
      String join(String array[], String separator):联合字符串数组

JSTL (JavaServer Pages Standard Tag Library)

重点

  1. 逻辑控制语句
    1. <%taglib prefix=”c” uri=”http://java.sun.com/jsp/jstl/core"%>
    2. 这里一定更要c字母表示
  2. 格式刷format
    1. <%@ taglib prefix=”fmt” uri=”http://java.sun.com/jsp/jstl/fmt" %>
    2. 一定用fmt
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
      49
      50
      51
      52
      53
      54
      55
      56
      57
      58
      59
      60
      61
      62
      63
      64
      65
      66
      67
      68
      69
      70
      71
      72
      73
      74
      75
      76
      77
      78
      79
      80
      81
      82
      83
      84
      85
      86
      87
      88
      89
      90
      91
      92
      93
      94
      95
      96
      97
      98
      99
      100
      101
      102
      103
      104
      105
      106
      107
      108
      109
      110
      111
      112
      113
      114
      115
      116
      117
      118
      119
      120
      121
      122
      123
      124
      125
      126
      127
      128
      129
      130
      131
      132
      133
      134
      135
      136
      137
      138
      139
      140
      141
      142
      143
      144
      145
      146
      147
      148
      149
      150
      151
      152
      153
      154
      155
      156
      157
      158
      159
      160
      161
      162
      163
      164
      165
      166
      167
      168
      169
      170
      171
      172
      173
      174
      Apache提供的标签库,
      jar包:jstl-1.2.jar,如果MyEclipse,它会在我们导入jar包,无需自己导入,如果没有使用MyEclipse那么需要自行导入。

      ------------------

      导入JSTL核心标签库
      <%taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>


      <c:set>
      * <c:set var="a" value="hello"/> 创建名为a,值为hello的域属性,范围:page
      * <c:set var="a" value="hello" scope="session"/> 范围为session

      <c:out>
      * <c:out value="aaa"/> 输出字符串aaa
      * <c:out value="${aaa}"/> 输出域属性aaa,其中与${aaa}相同
      * <c:out value="${aaa}" default="xxx"/>如果${aaa}不存在,那么输出xxx字符串
      * <c:out value="${aaa}" escapeXml="true"/>如果${aaa}中包含特殊字符,那么转义它。这可以防止javascript攻击

      <c:remove>
      * <c:remove var="a"/> 删除名为a的域属性
      * <c:remove var="a" scope="page"/> 删除page域中名为a的域属性

      <c:url>
      * <c:url value="/AServlet"/> 输出URL:/项目名/AServlet
      * <c:url value="/AServlet" var="url" scope="page"/> 把生成的url保存到page域中,而不会输出
      * <c:url value="/AServlet">:输出URL:/项目名/AServlet?username=%xx%xx%xx%xx%xx%xx,其中张三会被URL编码
      <c:param name="username" value="张三"/>
      </c:url/>

      <c:if>
      * <c:if test="${条件}"> 当条件为true时执行标签体内容
      hello
      </c:if>

      <c:choose>
      * <c:choose>
      <c:when test="${条件1}">a</c:when>
      <c:when test="${条件2}">b</c:when>
      <c:when test="${条件3}">c</c:when>
      <c:otherwise>d</c:otherwise>
      </c:choose>

      等同与:
      if() {
      } esle if() {
      } esle if() {
      } else if() {
      } else {
      }

      -------------

      <c:forEach>

      可以用来遍历数组、List、Map、

      1. 计数循环

      <c:forEach begin="1" end="10" var="i">
      ${i}
      </c:forEach>
      等同于
      for(int i = 1; i <= 10; i++) {
      out.println(i);
      }


      <c:forEach begin="1" end="10" var="i" step="2">
      ${i}
      </c:forEach>
      等同于
      for(int i = 1; i <= 10; i+=2) {
      out.println(i);
      }

      -------------

      2. 遍历数组

      <%
      String[] names = {"zhangSan", "liSi", "wangWu", "zhaoLiu"};
      pageContext.setAttribute("ns", names);
      %>
      <c:forEach var="item " items="${ns } ">
      <c:out value="name: ${item } "/><br/>
      </c:forEach>


      -------------

      3. 遍历List

      <%
      List<String> names = new ArrayList<String>();
      names.add("zhangSan");
      names.add("liSi");
      names.add("wangWu");
      names.add("zhaoLiu");
      pageContext.setAttribute("ns", names);
      %>
      <c:forEach var="item" items="${ns }">
      <c:out value="name: ${item }"/><br/>
      </c:forEach>

      -------------

      4. 遍历Map

      <%
      Map<String,String> stu = new LinkedHashMap<String,String>();
      stu.put("number", "N_1001");
      stu.put("name", "zhangSan");
      stu.put("age", "23");
      stu.put("sex", "male");
      pageContext.setAttribute("stu", stu);
      %>
      <c:forEach var="item " items="${stu }">
      <c:out value="${item.key }: ${item.value } "/><br/>
      </c:forEach>


      -------------

      5. 循环状态对象

      循环状态对象是用来说明循环的状态的,属性如下:
      count:int类型,当前已遍历元素的个数;
      index:int类型,当前元素的下标;
      first:boolean类型,是否为第一个元素;
      last:boolean类型,是否为最后一个元素;
      current:Object类型,表示当前元素。

      <c:forEach var="item" items="${ns }" varStatus="vs" >
      <c:if test="${vs.first } ">第一行:</c:if>
      <c:if test="${vs.last } ">最后一行:</c:if>
      <c:out value="第${vs.count } 行: "/>
      <c:out value="[${vs.index } ]: "/>
      <c:out value="name: ${vs.current } "/><br/>
      </c:forEach>


      ------------------

      导入JSTL格式化标签库

      format

      <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>

      <%
      Date date = new Date();
      pageContext.setAttribute("d", date);
      %>
      <fmt:formatDate value="${d }" pattern="yyyy-MM-dd HH:mm:ss "/>

      ---------

      <%
      double d1 = 3.5;
      double d2 = 4.4;
      pageContext.setAttribute("d1", d1);
      pageContext.setAttribute("d2", d2);
      %>
      <fmt:formatNumber value="${d1 }" pattern="0.00 "/><br/>
      <fmt:formatNumber value="${d2 }" pattern="#.## "/>

      * pattern:0.00,表示小数不足两位时,使用0补足两位
      * pattern:#.##,表示小数不足两位时,有几位显示几位,不会补足


      ============================
      ============================
      ============================

2017年9月9日 下午10:27

概述

  1. node.js我只是作为一个知识的补充,没有深入的学习。需要使用的话可以参考文末最后给出的两个链接,上面有详细的入门教程
  2. node.js最有用的地方对我来说是,通过node.js让我了解的不同服务器脚本语言之间的比较,从事件机制和异步IO模型的角度去认知整个服务端。
1
NodeJS的作者说,他创造NodeJS的目的是为了实现高性能Web服务器,他首先看重的是事件机制和异步IO模型的优越性,而不是JS。但是他需要选择一种编程语言实现他的想法,这种编程语言不能自带IO功能,并且需要能良好支持事件机制。JS没有自带IO功能,天生就用于处理浏览器中的DOM事件,并且拥有一大群程序员,因此就成为了天然的选择。

通过node.js来了解整个web服务端面临的问题,以及部分解决方案

Node.js是用来做什么的? - 知乎
Node.js详细解析 - CSDN博客
这两篇文章说出了node.js在整个行业中的重要地位。

node.js学习日记

  1. 先说说我是怎么拐到node.js上面的。
  2. 我本来是是在学习javaWeb的MVC,我自然的就和ThinkPHP框架的CBD模式产生了联系,于是我就想再把自己对框架模式的知识面扩展一下。我找了一会,前面几篇写的我认为不好,当时突然我就看见了这篇界面之下:还原真实的MV*模式 · Issue #11 · livoras/blog · GitHub,我觉的这个人的水平可以,写的这篇文章也是言之有理,所以很是喜欢。
  3. 我先读完了一遍,心中还是有几个疑惑不懂得地方,毕竟自己知识有限,没有真正的见过使用这些模式的代码,于是就返回去把一些小的点努力思考了一下。其实这时候我知道这是很虚的,因为一个成熟的框架设计模式怎么能让我一下就能吸收了呢。于是我对自己提出了更高的要求—把作者给的源码也看看吧,我就得我js还可以,写不出来吧,看还是没问题的。于是我的噩梦就开始了。
  4. 我一开始真的以为就是js,还在不停的回想我总结的js的知识,尤其的面向对象的,但是心里总有说不出来的不舒服,我当时也没有太注意,只是翻来覆去的看,稍微懂点,但是也有很多不懂得地方(反过头来想,其实出现这种问题的原因就是js语言基础不好,这也是我以前说的,看源码的基础一定是你对语言有了比较深刻的了解之后才能做得),这时心中不断的提出问题,然后尝试给出答案,将我的猜测带入程序中去验证,最后就在不断地磨蹭当中,认为作者只是给了我们核心源码,他的调用啥的都有给,当时还在抱怨作者为啥这么懒。
  5. 本来分析到这也就差不多了,想mvc和mvp这两种模式我基本上时看懂了,但是对于其中的关键的观察者模式,我一直很疑惑,为啥我在view中就没有发现view是如何实现观察者模式的。我但猜测这是作者导入的那个库文件完成的。
  6. 我对自己说—走到这了不能放弃,把那个库文件也了解一下吧,看看他是不是来完成观察者模式的,验证一下自己的想法。这一查五雷轰顶,这是node.js的库文件,我把它当成js看了半天,天哪😲。我以前对node.js只是听说过,知道他可以代替php这些脚本语言,其他的啥都不知道了。
  7. 我这时竟然没有停下脚步,查了一下node.js手册Node.js 教程 | 菜鸟教程,随便看了看他的安装过程,最通俗的理解—node.js是为js在服务器端运行的一个环境,那么岂不是说其实就是在服务器端使用js完成php能完成的功能吗。
  8. 说道php了,那可是我的老本行,我真的很想把node.js和php进行对比。兴趣来了,我看的就带劲了。边看他的手册,边回忆自己php的知识,不断的碰撞(下面有我的一下简单的对比)。这时我返回去看作者的代码,发现原来作者把整个项目目录都给了,上层中还有很多文件,我找到我一直想看的调用这三个对象的一个总文件mvc.js(model对象,view对象,controller)。就在这时我在纠结一个问题—-view对象中涉及到了对html标签的控制,我就很疑惑这个html文件到底在哪里,难道设node.js本身就能配置,放在了一个地方,view对象和这个html文件是通过node.js中的配置文件完成的吗?我然后在项目中翻来翻去,去找那个配置文件,没有找到,百度出来都是有关app.js(后来我才知道这是express框架的的),脑子中一篇混乱。无意间我在mvc.html文件中找到了文件的最后引用了mvc.js这个文件。我懂了—-就像前台引入jQuery.js的道理一样啊。
  9. 我然后把作者代码中的那几个node.js中的库文件查了查,了解了一下他们的用途,此时心中背堵着的感觉慢慢下去了。但是,我提出了一个新的问题——你现在是node.js这个专门的解析js的环境下运行的这段代码,那么当真正用户从客户端浏览器访问的时候,这些node.js环境下的库文件,直接给了浏览器他能像你引入jQuery.js一样下载到本地进行解析吗?nodejs 怎样在浏览器中运行_百度知道这里和我说的疑惑一样。

与php的简单对比(肤浅)

  1. node.js的服务器启动尽然是运行自己写的.js文件来启动
  2. node.js中express框架中也有类似Echo的方法
  3. 每个页面.js文件是可以单独执行的和php一样
  4. Express还结合了框架的效果如模板引擎
  5. 一个.js文件可以是一个js对象,就像一个.php文件可以是一个php类

我查过的一些资料

重要的:七天学会NodeJSNode.js Express 框架 | 菜鸟教程
次要的:
module.exports用法 - xqnode的博客 - CSDN博客
eventEmitter总结 - 简书
Nodejs学习 2 — events事件处理EventEmitter - z742182637的博客 - CSDN博客
10分钟快速学Handlebars - CSDN博客
Vue.js 模板语法 | 菜鸟教程
剖析Vue原理&实现双向绑定MVVM - 前端足迹 - SegmentFault
Vue.js——轻量高效的MVVM框架(一、初识Vue.js) - DarkRanger - 博客园
使用Node.js完成的第一个项目的实践总结 - Node.js知识库
Handlebars 模板引擎之前后端用法 - 茄果 - 博客园

2017年9月8日 上午10:38

概述

有以下几个步骤

  1. 修改jdk版本
  2. 导入servlet-api.jar包,解决项目报错的现象
  3. 中文乱码

修改jdk版本



导入servlet-pai.jar包

注:这个包在tomcat中的lib路径中




中文乱码

有的文件可以通过修改字符集gbk来更改,但是也有些不行,就像下面的
这时只能从外面用记事本打开,然后复制进来

2017年9月8日 下午5:21

项目的核心代码组织形式

CBD使用配置文件,适合需要大量订制的项目,如框架
MVC适合也业务流,mvc就像一个运输道,中间运输的是数据,数据源是数据库

CBD和MVC都是一种组织代码(组织人员)的方式,只不过他们用不同的用途,没有好坏,只有适合不适合。

在数据处理传递的过程中,变更逻辑操作语言

  1. 上面说到了数据的处理,数据除了在服务层和控制层(公司内部)进行各种边传递边处理外,那么去了页面层(公司外部门面)如何控制呢?
  2. 只有真正的过程型的语言(面向对象语言)才可以方便的控制数据操作,如果通过html这种标签语言,他是无法写逻辑的,所以也就无法有效的控制页面中的数据以及其他动态的东西。
  3. 这时有两种解决方式。
  4. 一种通过jsp_php,通过这种脚本语言实现html和jsp_php的混写,至于如何处理这种混乱的情况则交给了服务器去完成。
  5. 还有一种方式是通过js这种脚本语言,与上面不同的是,即使他也是一种脚本语言,因为处理js的是浏览器,不是服务器,js不能实现与html的混写,他是控制html的。
  6. 那么,数据通过java从公司内部传出,然后交到外部页面就有两种处理方式,如果选用jsp/php这种脚本语言,则可以直接逻辑控制传来的数据,而如果是js来控制,那么由于js只能控制html,不能直接操作jsp中的数据,那么中间的过渡就是html。jsp将数据给了html,让html暂时保存,然后js从html中取出数据,然后再进行处理。

路由规则:servlet其实就是实现了一个路由规则,
然后还提供了取值方法和三个作用域对象,为了方便数据的保存。

来源:
浅谈MV*模式 - Sam君 - SegmentFault
界面之下:还原真实的MV*模式 · Issue #11 · livoras/blog · GitHub

在读的过程中我的几点疑惑以及我的解决:

  1. 观察者模式忘了:
    1. 全局搜索,找到设计模式去看我的理解
    2. 其实:观察者模式是策略模式的改进,但是,我们可以宽泛的将这种关系理解成雇员和雇主的关系。每一个箭头都是对象之间的代表一次调用,被调用的就是雇员,另一个就是雇主,比如说在第一类mvc中model就是雇主。
  2. 在说第一类MVC缺点时,view是无法复用的:
    1. 由于依靠雇主-雇员模式,这是一种强依赖,既然view依赖于model,那么view当然不能自己出去单干了
    2. 这点可以和MVP模式对比,MVP模式的优点就是view可以复用,因为view中不用调用model对象来实现功能,自己本身就是功能的实现着,只不过在MVP中提供了接口来作为一个功能开始执行的触发。从view的角度去分析,我不管谁调用我的,只要你能正确的调用我的接口就可以,那么这不就实现了复用了吗。
  3. 对view的理解:
    1. View不要仅仅的理解成平常见得html页面,其实一个system.out.print都可以算是一个view(纯java)
    2. 我在读这篇文章的时候,就默认view就是html界面,给我造成了很大的理解上的障碍,例如在这里view这里抽象组合为了一个js对象
  4. 有很多模式中关键的实现步骤,并不是作者写的,而是作者直接调用了现成的库去完成
  5. 我们为啥要使用这种模式去组织代码,我用jQuery就可以完成的功能
    1. 这个原因很多:在web中mvc模式可以实现把视图层拿出来,这样分开步骤有利于开发人员有清晰的思路,而且可以对dao层代码进行复用。像我的权限系统,就是为了能有一个良好的扩展性。还有的为的是看起来方便,有的是从性能角度等等很多很多原因

2017年9月7日 上午11:07

概述

  1. Servlet提供三个作用域(变量池),用于让方便用户存储变量
  2. 关键是要了解这三个作用域(变量池),何时开始,何时释放不要自己需要这个池子里的变量时,但是池子已经释放了
  3. 附录中有使用的源码

servlet的作用域

概述:每个作用域对象都相应的代表一个域容器 其中的信息在本域中共享。

  1. request作用域 作用范围:一次请求
    1. 当前request池子结束标志:
      1. 用户刷新了一下当前页面,原来的request池子就释放了,产生了一个新的request池子
    2. 如果使用在service中使用请求转发的方式,那么依然算一次请求,request池子还在
  2. session作用域 作用范围:一次会话
    1. session池子结束标志
      1. 用户把浏览器关了
      2. 用户换了一个浏览器登陆
  3. application作用域 作用范围:一次服务周期
    1. application结束标志
      1. 服务器管理员将tomcat服务器重启了
  4. application作用域 > session作用域 > request作用域
    1. 小的作用域存在,大的作用域一定存在

附录:

MyServlet5 extends HttpServlet:给池子里赋值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package com.shanxi.weixin.servlet;

import java.io.IOException;
import java.util.Enumeration;

import javax.servlet.GenericServlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class MyServlet5 extends HttpServlet {

/*
* 接收所有请求的方法
*/
@Override
protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
HttpSession session = req.getSession();
ServletContext application = req.getServletContext();

req.setAttribute("name","mike");
session.setAttribute("name","john");
application.setAttribute("name","rose");

//req.getRequestDispatcher("myServlet6").forward(req, res);
res.sendRedirect("/servletDemo/myServlet6");
}

}

MyServlet6 extends HttpServlet:从池子里取值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package com.shanxi.weixin.servlet;

import java.io.IOException;
import java.util.Enumeration;

import javax.servlet.GenericServlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class MyServlet6 extends HttpServlet {

/*
* 接收所有请求的方法
*/
@Override
protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
HttpSession session = req.getSession();
ServletContext application = req.getServletContext();
System.out.println(req.getAttribute("name"));
System.out.println(session.getAttribute("name"));
System.out.println(application.getAttribute("name"));

}

}

2017年9月7日 上午10:39

Rambing的博客 - Tomcat7分类文章列表 - ITeye技术网站
Tomcat源码分析(一) - Crazy兔子 - 博客园
tomcat - 程序员小董的专栏 - CSDN博客
五年java人的一点感悟+tomcat源码
如何阅读Tomcat源代码? - 知乎

推荐一本好书《How Tomcat Works》 - 王程斯的专栏 - CSDN博客
专栏:How Tomcat Works笔记 - CSDN博客
tomcat源码分析 + spring源码分析 +rocketMQ源码分析

tomcat源码学习-环境搭建 - 简书
简单快速搭建tomcat可运行源码 - 赫双炎 - CSDN博客
怎样调试Tomcat源码

how-tomcat-works中文版.pdf
Tomcat源码研究.pdf

2017年9月7日 上午8:58

上下文对象的作用:

获取web.xml的 标签中的值,标签的作用域是所有的servlet类文件,这点与一个具体servlet类对应的标签下的标签,作用域是不同的,可以将标签的值理解成一个全局变量

获取方法:

  1. 继承HttpServlet的类中:在service()方法中使用getServletContext()方法来获得
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    /*
    * 接收所有请求的方法
    */
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
    //servlet 四大作用域对象之一。他是servlet上下文对象
    ServletContext application = getServletContext();
    //getInitParameter(java.lang.String name)
    String value = application.getInitParameter("param-name");
    System.out.println(value);

    }
    1. 实现Servlet接口的类中:通过ServletConfig对象的getServletContext()方法来获得上下文对象
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      /*
      * servlet 初始化方法
      * servlet生命周期方法之一
      */
      @Override
      public void init(ServletConfig arg0) throws ServletException {
      System.out.println("init 222 ...");
      String value = arg0.getServletContext().getInitParameter("param-name");
      System.out.println(" 222 ... "+value);
      }

在web.xml中的配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" metadata-complete="true" version="3.0">
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>

<context-param>
<param-name>param-name</param-name>
<param-value>param-value</param-value>
</context-param>

.....

</web-app>

2017年9月7日 上午8:40

概述

这个类的作用是处理响应和请求
主要是是在service()方法中实现
最后附录三种有源码


接受请求方式


其中主要使用

  1. doGet:接受get请求
  2. doPost:接受post请求
  3. service:接受所有请求 get+ post

MyServlet3.class 继承自httpServlet,实现了三个接受请求的方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
package com.shanxi.weixin.servlet;

import java.io.IOException;

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

public class MyServlet3 extends HttpServlet {

/*
* 接收所有请求的方法
*/
@Override
protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
//servlet 四大作用域对象之一。他是servlet上下文对象
ServletContext application = getServletContext();
//getInitParameter(java.lang.String name)
String value = application.getInitParameter("param-name");
System.out.println(value);

}

// /*
// * 接收Get请求的方法
// */
// @Override
// protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// System.out.println("doGet...");
// }
// /*
// * 接收Post请求的方法
// */
// @Override
// protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// System.out.println("doPost...");
// }

}

两种响应方式:附录代码

请求转发:

替换方式 xml 404
情景理解

  1. 老公的手机屏幕亮了,我一看是一条短信,随便一看,发现语言特别暧昧,于是我猜测是小三。于是,我果断的拿起手机,回了一条短信“你在…宾馆等我,我马上过去”。然后把这个短信删了,我就出发了。小三不知道是我,所以她高兴的来了。我一见它就是一顿暴打,爽!
  2. 这里的小三就是浏览器,她找的其实是我老公,但是最后他的请求让我处理了。重要的是她从头到尾不知道,这就是请求转发
    转发

实现

1
req.getRequestDispatcher("/index.jsp").forward(req,res);

注:这里的路径直接替代web.xml中的请求文件

重定向

  1. 重定向是服务器对客户端响应了本次请求,响应状态吗是302,客户端接收到响应码之后,直接再次发送一个新的请求到重定向的location上。(不受用户控制)
  2. 重定向实际上是两次请求

实现1

1
res.sendRedirect("/servletDemo/index.jsp");

注:这里要写从根路径开始
实现2

1
2
response.setStatus(302);
response.setHeader("location", "/ResponseDemo/ResponseDemo13");

实现1是实现2的封装
参考:Servlet实现重定向的两种方式 - 张昊亮 - 博客园


如何处理get请求的乱码


解决方法

1
2
3
4
String name = req.getParameter("name");
byte[] bytes = name.getBytes("iso-8859-1");
name = new String(bytes, "utf-8");
System.out.println(name);

步骤解析:

  1. 获取url中的参数保存在name中,此时name输出是乱码
  2. 所以,我们把字符串类型的name转换成字节型保存在byte[]数组中,这种最原始的方式
  3. 然后对byte[]数组重新选择格式进行解码

:默认浏览器的编码格式是iso-8859-1,要转换成的格式是我们当前项目的格式,这里是utf-8


附录一:
res.sendError(404,"你请求的资源在我这,我就不让你看!");

附录二:
当一下两种相应方式同时存在时,会报错

1
2
req.getRequestDispatcher("/index.jsp").forward(req,res);
res.sendRedirect("/servletDemo/index.jsp");

附录三:public class MyServlet4 extends HttpServlet完整源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
package com.shanxi.weixin.servlet;

import java.io.IOException;
import java.util.Enumeration;

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

public class MyServlet4 extends HttpServlet {

/*
* 接收所有请求的方法
*/
@Override
protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
/*
* HttpServletRequest 请求对象
*/
String path = req.getContextPath();
System.out.println(path);
String requestURI = req.getRequestURI();
System.out.println(requestURI);
Enumeration<String> names = req.getParameterNames();
String name = req.getParameter("name");
System.out.println(name);
byte[] bytes = name.getBytes("iso-8859-1");
name = new String(bytes, "utf-8");
System.out.println(name);
// while(names.hasMoreElements()){
// String name = names.nextElement();
// System.out.println(name+" "+req.getParameter(name));
// }

//服务器响应客户端的两种响应方式: 请求转发 重定向
/*
* 请求转发实际上是一次请求在进行传递
* 重定向是服务器对客户端响应了本次请求,响应状态吗是302,客户端接收到响应码之后,直接再次发送一个新的请求到重定向的location上。(不受用户控制)
* 重定向实际上是两次请求
*/
//req.getRequestDispatcher("/index.jsp").forward(req,res);
//res.sendRedirect("/servletDemo/index.jsp");

/*
* HttpServletResponse 响应对象
*/
res.sendError(404,"你请求的资源在我这,我就不让你看!");


}

}

2017年9月7日 下午3:47

概述

Jsp就是在html中添加java语言的一种技术,和php一样,但是我感觉php一个include 一个echo就搞定的全部的事情,而这里的jsp像下面弄出那么多东西,真是麻烦的要死,而且其中的jsp语法基本上用java语言就能够代替,jsp只是给了另一种实现方式,既然这样,能用java就不用用jsp,能减轻自己得去记忆那么多jsp标签的作用,这下只记得<%%>中可以写java语法就行了
注:jsp最后会被tomcat编译成servlet文件(.java),然后在编译成.class文件让tomcat执行


jsp

  1. 两种注释
  2. 三种脚本元素
  3. 三种指令
  4. 七个动作
    1. forward:请求转发
    2. getProperty :直接就输出了
    3. Include:过滤多余的page命令 包含内容一般都是纯文本
  5. 九个内置对象
    1. page:相当于this 当前页面的引用
    2. out:
      1. out.println(“abc<./font>”);这引号中的内容是会被解析的
    3. pageContent :
      1. 可以获取其他八个page对象
      2. 是一个页面的池子

javaBean:

  1. 基础的作用就是导入外部类进入jsp中

  2. Javabean对外部类有严格的要求

  3. 有两种引入和使用方法

  4. .class 文件名不能跟class后缀,但是默认的就是导入.class文件

  5. 参考:JavaBean简介及使用 - Joywy的专栏 - CSDN博客


exception对象的使用

  1. 工作过程
    1. 不用写重定向或者请求转发的跳转语句,他会直接找到当前页面<%page errorPage=“errrorpage路径”%>中声明的文件,并且这个路径对应的错误页面设置了<%page isErrorPage=true”%>,那么,在错误页面就可以使用exception对象方法来输出
    2. 这个跳转的过程是自动的请求转发实现的
  2. 完整的例子
    1. JSP获取异常信息的exception对象 - 孤云博客
  3. 限制:
    1. 只能对于500的错误进行自动的处理,其他额4是没有办法处理的
  4. 解决方式:web.xml
    1. 这时就不用在引起异常的页面中添加<%page errorPage=“errrorpage路径”%>,
    2. 特别的,当用IE打开错误页面时,是不会跳到对应的错误页面
    3. web.xml配置错误页面,及输出错误信息

tomcat将jsp编译成servlet


Work_Catalina_localhost 路径下就是编译产生的文件

这里的demo_jsp.java 就是jsp编译产生的java文件,然后java文件再产生demo.jsp.class二进制文件。
用这个二进制文件进行执行

编译jsp产生的demo_jsp.java中可以看到实现了HttpJspPage接口,而这个HttpJspPage接口的超级接口有servlet接口,这就说明了demo_jsp.java其实就是一个servlet(jsp就是一个servlet)
out.print和out.write - - ITeye博客

返回是object对象,要.toString()进行类型转换
null.toString()错
多了一个当前页面

2017年9月6日 下午6:43

6.15~6.27
6.27~6.27继承 -> 多态 -> 抽象 -> 接口 -> 异常
6.28 集合泛型 + 文件操作
6.29 常用类
6.29数组
6.30生产者消费者
6.30 线程
706内部类+反射
706Swing
项目结构总结
java用文件实现类似数据库的增删改查
java基础阶段图书管理系统项目需求分析过程
图书管理系统项目中遇见的问题
java错题