zoukankan      html  css  js  c++  java
  • servlet

    服务器
    1)让网页共享
    2)让最终使用者能够访问service的java代码

    如果使用java开发
    服务器软件: tomcat

    如果使用64位的操作系统 apache-tomcat-6.0.36-windows-x64.zip
    如果使用32位的操作系统 apache-tomcat-6.0.36-windows-x86.zip

    前提:必须在环境变量中设置JAVA_HOME
    安装:解压软件到任意目录
    /bin/startup.bat (启动服务器脚本)
    /bin/shutdown.bat (关闭服务器脚本)
    还可以直接关闭黑窗口来停止服务

    tomcat默认要占用8080的端口号
    如果被其他程序占用,会报 Socket bind(绑定端口时) failed :

    /conf/server.xml
    检查是否正常运行:
    在浏览器上输入一个字符串 URL (同一资源定位符) 俗称网址

    请求的协议 服务器的ip地址 端口号
    http://localhost:8888 访问了服务器的主页面

    服务器网页和程序的存储目录:webapps
    ROOT 是tomcat中一个应用程序,它包含了主页面

    如果要访问一个网页:
    http://localhost:8888/ 等价于 http://localhost:8888/index.html
    http://localhost:8888/index.html
    http://localhost:8888/1.html

    请求的协议 服务器的ip地址 端口号 / 应用程序名(对应磁盘上的目录名)
    http://localhost:8888/my/2.html

    如果不写端口号,默认端口号是80

    底层原理: 【了解】
    输入网址后,回车
    1)向tomcat服务器发送了一个请求,请求的格式要符合http协议
    GET /my/index.html HTTP/1.0
    host: localhost

    2)服务器接到请求
    3)由服务器返回一个响应, 响应中包含了html内容
    HTTP/1.1 200 OK (200表示成功,404表示访问的内容不存在,500表示服务器内部出现错误)
    Server: Apache-Coyote/1.1
    Accept-Ranges: bytes
    ETag: W/"140-1430968391950"
    Last-Modified: Thu, 07 May 2015 03:13:11 GMT
    Content-Type: text/html
    Content-Length: 140
    Date: Thu, 07 May 2015 03:13:27 GMT
    Connection: close

    <!doctype html>
    <html lang="en">
    <head>
    <meta charset="GBK">
    <title>Document</title>
    </head>
    <body>
    我的应用程序
    </body>
    </html>

    HTTP协议: 向服务器发送请求,或是从服务器接收响应时要遵从的格式
    特点:无状态
    http:1.0中请求到达服务器,连接打开,响应返回后,连接就关闭
    目的是为了能够让更多的用户同时访问服务器.
    http:1.1中请求到达服务器,连接打开,响应返回后,连接不会马上断开
    而是等待一段时间,如果在等待时间内没有请求,才会关闭连接
    请求与请求之间是没有关联的。一次请求的内容无法被其他请求所共享

    如何生成动态html内容
    Servlet API (定义了一套接口)
    HttpServlet
    接收http请求
    返回一个响应 (返回一个网页响应, 二进制响应..)

    =============================== day 1 下午====================================
    步骤1:
    java 需要继承 HttpServlet
    步骤2:
    重写父类的方法:
    /**
    * HttpServletRequest 接口,代表请求
    * HttpServletResponse 接口,代表响应
    */
    public void service(
    HttpServletRequest request,
    HttpServletResponse response)
    throws ServletException, IOException{

    }

    步骤3:
    用response对象返回响应
    1) response.setContentType(String 类型); // 设置响应的类型
    text/html 表示文本的html响应
    image/jpeg 表示返回jpeg 格式的图片
    image/png 表示返回png格式的图片
    ...
    2) response.setCharacterEncodeing(String 编码格式);
    编码格式: utf-8, gbk ...

    3) response.getWriter(); // 得到响应的字符输出流
    response.getOutputStream(); // 得到响应的字节输出流

    步骤4:(部署)
    1) 部署目录
    应用程序文件夹(my)
    + WEB-INF
    + lib (放置第三方jar包)
    - ojdbc5.jar
    + classes (放置class 二进制文件)
    包名
    类名
    - web.xml (配置servlet的访问路径)
    - index.html

    2) 配置web.xml文件

    <servlet>
    <servlet-name>名字</servlet-name>
    <servlet-class>实际的包名.类名</servlet-class>
    </servlet>

    <servlet-mapping>
    <servlet-name>名字</servlet-name>
    <url-pattern>/路径</url-pattern>
    </servlet-mapping>

    http://ip地址:端口/应用名/url-pattern的地址


    ================================ day2 ===================================
    典型问题:
    1. 如果报了405错误,service方法名字写错, 或参数位置不对(没正确覆盖父类方法)
    2. 404错误: 是由于没有找到要访问的资源(html, servlet)
    3. 如果响应类型写错,如:
    response.setContentType("test/html");
    浏览器会把响应当作文件下载
    4. 避免响应乱码:
    1) <meta http-equiv='content-type' content='text/html;charset=utf-8'>
    2) response.setContentType("text/html;charset=utf-8");
    选择一种

    ===========================================================
    1.用myeclipse简化servlet开发步骤
    1. 建项目时需要用Web Project...
    Context Root URL 指项目的名字
    2. 要在myeclipse 中配置tomcat服务器
    3. 用一个 按钮 deploy 部署应用程序
    如果代码发生了修改,使用redeploy 按钮重新部署
    或者
    重新启动tomcat服务器,也可以让修改生效

    2. 接收请求【重点】
    HttpServletRequest request

    .getRequestURI() 得到请求路径
    /项目名/url-pattern的值

    请求路径:
    /项目名/url-pattern的值?请求参数名=请求参数值&参数名2=参数值2

    .getQueryString() 得到?后的请求参数字符串

    .getParameter(String 请求参数名) 返回请求参数值 【重点】

    <!-- action 表示请求路径
    method 提交方式 get 请求就是把请求参数跟在请求路径之后
    post 会把请求参数隐藏起来-->
    <form action="/servlet/request" method="post">
    <!-- 传递请求参数的作用 username=实际填写的值 -->
    <input type="text" name="username"/>
    <input type="password" name="pass"/>
    <!-- 提交表单: 把表单内的数据,变成请求参数,发送给服务器 -->
    <input type="submit" value="提交"/>
    </form>


    .getParameterValues 它用来获取请求参数名一样,但值有多个的(复选框)

    3. 请求参数的中文乱码
    请求参数中不能有中文,如果有,浏览器会对参数做编码处理
    服务器应当做响应的解码处理,否则就会有中文乱码

    网页的字符集,要和解码使用的字符集一样,要么都是utf-8 要么都是gbk

    解码:【重点】
    // 对于get请求
    String username = request.getParameter("username");
    String result = new String(username.getBytes("iso-8859-1"), "utf-8");
    // 对于post请求
    在调用getParameter之前,先调用request.setCharacterEncoding("字符集");

    建议:get请求中尽量避免请求参数中出现中文

    ================================== 作业 ============================
    1. 实现登录例题,servlet,service, dao
    2. FrontService
    查询所有商品

    servlet => 调用 查询所有商品方法 , 将所有商品信息显示为一张表格
    image 图片列 ? => 显示为他对应的图片

    =============================== day 3 ==================================
    回顾:
    1. servlet
    运行在tomcat 服务器上的java代码
    作用:处理浏览器发给服务器的请求,并把html内容作为响应返回给客户端

    2. 如何开发一段servlet代码 【重点】
    1) extends HttpServlet
    2) service(HttpServletRequest, HttpServletResponse)
    请求 响应
    3) 处理请求
    参数1=值1&参数2=值2

    String 值 = request.getParameter("请求参数名");

    get 请求 参数跟在请求地址之后, 参数字符串有长度限制
    (获取)
    直接在浏览器输入地址,或通过超链接点击一个地址
    <a href="/my/hello"></a>

    new String("值".getBytes("iso-8859-1"), 用来解码的字符集);
    注意: 用来解码的字符集 要与网页的字符集一致

    post 请求 没有跟着请求地址之后, 隐藏了, 没有长度限制
    隐藏并不意味着安全, https协议(可以对传输的数据进行加密)
    (发送)

    request.setCharacterEncoding(解码的字符集);
    request.getParameter();
    4) 返回响应
    response.setContentType("响应类型");
    response.setCharacterEncoding("网页内容的编码字符集");
    response.getWriter().println(html内容);
    5) 请求转发
    request.getRequestDispatcher("html网页地址")
    .forward(request,response);
    servlet不负责返回html内容了,而是转发到另一个网页,
    返回的是这个网页的内容


    3. 配置servlet
    web.xml
    <servlet>
    <servlet-name>名</servlet-name>
    <servlet-class>包.类名</servlet-class>
    </servlet>

    <servlet-mapping>
    <servlet-name>名</servlet-name>
    <url-pattern>/servlet路径</url-pattern>
    </servlet-mapping>


    =============================================================
    1. jsp 网页
    servlet 只负责处理请求和调用业务逻辑
    把处理响应的职责交给 jsp来负责

    <%@ 指令名 属性="值" %>

    <%@ page pageEncoding="" contentType=""%>

    pageEncoding=""
    等价于
    response.setCharacterEncoding();

    contentType="text/html; charset=ISO-8859-1"
    等价于
    response.setContentType("text/html; charset=");


    ISO-8859-1 英文字符集
    GBK 简体中文
    BIG5 繁体中文
    UTF-8 中文 日文 韩文 ... (推荐使用)

    2. 思想(分工协作):
    servlet 只负责接受请求参数,调用业务逻辑
    jsp 负责显示动态网页

    servlet存值,jsp取值

    中间通过请求转发结合:
    request.getRequestDispatcher("/jsp路径").forward(request, response);

    3. 存取值 【重点】
    request.setAttribute("变量名", Object值); // 存


    jsp页面里使用EL表达式

    ${ 表达式 }

    从request中取:
    1) requestScope.变量名
    2) 如果变量是list集合 : requestScope.变量名[下标]
    3) 如果变量是map集合 :
    requestScope.变量名["key"]
    requestScope.变量名.key

    key 建议使用String 类型
    value 可以是任意类型
    4) 实体类对象
    ${ requestScope.变量名.属性名 }

    这里的【属性名】
    其实是以 get 或 is的方法名为准,不是那个私有属性名


    4. 遍历list集合
    jsp标签
    导入一个标签库
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

    request.setAttribute("l", list); // "北京" "上海"
    <c:forEach items="要遍历的集合" var="临时变量名">
    ${ pageScope.临时变量名 } , 还可以包含任意其他的html代码
    </c:forEach>



    <c:forEach items="${requestScope.l}" var="s">
    ${ pageScope.s }
    </c:forEach>
    对比===》
    for(String s: list) {


    }

    5. 了解
    以/开头的路径:绝对路径 格式: http://ip地址:端口号+绝对路径
    没有以/开头的路径:相对路径 格式:
    找到浏览器当前的网页地址(去掉最后一个/以后的部分) + 相对路径


    推荐:绝对路径

    ===================================== day4 ================================================
    1. 改写原来的登录程序
    2. 要求在不同请求中显示用户名

    ============================================================================
    1. Session (会话) 【重点】

    同一个浏览器跟服务器之间发送的多次请求,可以称为一个会话

    多次请求间需要共享的变量(比如说用户名),可以存储在会话当中

    HttpSession 会话接口
    String Object
    .setAttribute("变量名", 值); // 向会话中保存变量
    .getAttribute("变量名"); // 返回保存的变量 是Object类型
    .removeAttribute("变量名"); // 删除保存的变量

    需要手动调用代码来创建会话
    HttpSession session = request.getSession();
    // 创建会话 等价于request.getSession(true);
    如果会话不存在,创建新的会话
    如果会话已经存在,返回已有的会话

    HttpSession session = request.getSession(boolean);
    // true 表示总是创建会话
    false 表示不创建会话 第一次 返回null
    销毁session (把session占用的内存,以及存储的变量全部清空)
    session.invalidate(); // 注销(安全退出)

    关闭浏览器, 再重新打开意味着开始了一个新的会话,上一个会话存储的内容就访问不到了

    【了解】
    session有一个过期时间:如果两次请求的间隔超过了30分钟(默认值), session就自动销毁
    可以在web.xml中设置:
    <session-config>
    <session-timeout>10</session-timeout>
    </session-config>
    单位是分钟


    ==============================================================
    2. el 表达式中的查找规则 【了解】
    ${变量名}
    page对象.getAttribute("变量名");
    request.getAttribute("变量名");
    session.getAttribute("变量名");
    application.getAttribute("变量名");

    如果没有加前缀,依次查找四个对象,pageContext, request, session, application
    谁先找到了,就用谁的变量


    request.setAttribute("username","zhang");
    session.setAttribute("username", "li");


    ${username} zhang
    ${sessionScope.username} li

    setAttribute, getAttribute, removeAttribute 四种 Scope作用域

    3. Cookie (小甜点) 【原理重点掌握】 【使用只需了解】
    目的是为了在客户端浏览器和tomcat服务器之间建立一种联系

    服务器生成cookie
    Cookie c = new Cookie("名","值");
    c.setMaxAge(int ); 单位秒 60 如果是大于0,表示cookie要存活多少秒
    默认值是-1,表示浏览器一关闭,cookie就失效
    =0 代表要删除此cookie
    response.addCookie(Cookie); 如果名字或值中有中文必须编码
    UrlEncoder.encode("原始值", "字符集")



    服务器获取由浏览器发送的cookie?
    Cookie[] 所有cookie = request.getCookies();

    cookie大小 (名+值) 大约是 4k
    浏览器能够存储每个服务器的 cookie的总数量 (20, 25, 50) 根据浏览器不同而不同

    用途:
    1) 几周内,一个月内不用输入用户名密码(记住密码功能)
    2) 记住购物车内的商品 (注意cookie 不能跨浏览器存储)
    3) 实现会话跟踪【重要原理】

    request.getSession();
    tomcat会给此session分配一个唯一id: FD3E3F40A0F36CA9BAF1BF5EA2D804F8

    tomcat会在这次响应返回值创建一个cookie
    Cookie c = new Cookie("JSESSIONID", "FD3E3F40A0F36CA9BAF1BF5EA2D804F8");
    c.setMaxAge(0); // 浏览器一关闭,这个cookie就失效了


    发送第二次请求时:
    JSESSIONID=FD3E3F40A0F36CA9BAF1BF5EA2D804F8


    session集合
    id session对象
    FD3E3F40A0F36CA9BAF1BF5EA2D804F8


    =========================================== day 5 ========================================
    1. 转发和包含

    servlet -> request.getRequestDispatcher("路径").forward(request,response); -> jsp, (html, servlet)后两种很少见
    servlet -> request.getRequestDispatcher("路径").include(request,response); -> jsp, servlet, (html)

    jsp -> <jsp:include page="路径"/>

    forward 转发 表示由下一个servlet或jsp返回响应
    include 包含 表示本servlet或jsp结合下一个servlet或jsp返回响应

    注意:
    如果被包含的servlet里面执行了转发操作,不行的!! 出现 stream close 异常

    2. servlet生命周期 (运行过程)
    默认是第一次向这个servlet发请求时创建此servlet的实例

    之后不论发送多少次请求,访问的都是同一个servlet

    servlet中不建议添加成员变量,因为会有多线程并发访问问题
    即使加了synchronized关键字也不好,会导致效率很低
    service 类可以作为servlet的成员变量,是因为service实现类本身是线程安全

    生命周期相关方法 【了解】
    构造方法
    init方法
    destroy方法
    service方法 多次调用
    父类的service方法中:
    String method = request.getMethed() => get, post
    if(method.equals("GET")) {
    doGet(request, response);
    } else if(method.equals("POST")) {
    doPost(request, response);
    }

    <!-- 表示此servlet会在服务器启动时被时被实例化和初始化 -->
    <servlet>
    ...
    <load-on-startup>数字,优先级(数字越小,优先级越高)</load-on-startup>
    </servlet>

    3. ServletContext 接口 【了解】
    上下文
    通常称为 application

    application.setAttribute("变量名", Object 值); // 保存变量
    Object 值 = application.getAttribute("变量名"); // 获取变量
    application.removeAttribute("变量名"); // 删除变量

    作用范围:整个应用程序
    它的内部实现使用了线程安全的 map集合

    4. 监听器 Listener 【了解】
    比如说,实现在线人数统计: 本质上是统计session的数量

    作用:
    可以检测session何时被创建或销毁 HttpSessionListener
    如果想检测应用程序启动和停止 ServletContextListener
    可以检测request何时被创建或销毁
    ....

    1) 针对不同需要,实现监听器接口
    2) 实现监听器中的方法(一般是两个)
    3) 配置 web.xml
    <listener>
    <listener-class>包.类名</listener-class>
    </listener>

    5. 重定向【重点】
    目的也是servlet -》jsp 或 servlet -》servlet之间执行跳转
    发送重定向
    response.sendRedirect("/项目名/1.jsp");

    转发
    servlet -》jsp 或 servlet -》servlet之间执行跳转
    request.getRequestDispatcher("/1.jsp").forward(request, response);

    不同之处:
    1)调用方法不同(request response)
    2)路径的写法不同(相对路径,绝对路径)
    3) 地址栏:forward 地址栏不会发生变化
    redirect 地址栏会发生变化
    4) 转发forward是一次请求
    重定向是两次请求
    5) 重定向的目标地址,不局限于本应用
    response.sendRedirect("/项目2/1.jsp"); // 跳到项目2的页面
    response.sendRedirect("http://www.baidu.com/"); // 跳转到另一个网站上
    这时候session也没有用了


    经验: 当你执行完增、删、改(没有需要显示的结果) => 重定向 查询逻辑servlet
    servlet 只是执行查询,需要用jsp显示结果 => 转发

    典型错误:
    servlet和jsp之间存取值使用 request 作用域(错误的)
    如果是使用重定向,那么servlet和jsp之间存取值必须使用 session作用域 (对)

    ===============================================================
    tomcat 两种运行模式 【了解】
    dubug (调试模式) 遇到断点停下来,并进入调试视图
    run (正常模式) 遇到断点不会停

    f8 继续运行
    f6 单步执行
    f5 进入方法

    myeclipse-> window -> perferences -> java -> debug
    suspend execution 第一个勾去掉 可以避免tomcat运行出异常是跳到debug视图

    调试模式 当代码发生改动,很多情况下不需要重新部署,或重启服务,代码就会生效

    出现:hot code replace failed 窗口,就必须重新部署,或重启服务, 改动才会生效


    ======================================================================
    url-pattern 的写法
    /开头

    /hello
    /day1/hello 合法
    /hello.do 合法
    /hello.action 合法
    /* 合法 先进行精确匹配servlet,如果没有匹配的servlet会选择/* 的servlet
    /*
    jsp的优先级最低
    /day1/* 合法 跟/*类似

    *.do 合法
    *.action 合法 优先级最低

    /*.do 不合法
    /day1/*.do 不合法


    http://ip:端口/项目名/day1/hello

    作业:

    消费者要使用的功能
    登录(已完成)
    注册 待完成
    注销(安全退出) 待完成
    查询商品 (查询所有)
    按价格、商品名、类别、 页号(每页商品数固定为3个) 进行查询 待完成
    需要先查询所有类别,类别要显示为下拉列表
    <input type="text" />
    购物车 待完成

    管理员要使用的功能
    查询商品 待完成
    修改商品 待完成
    新增商品 待完成

    查询类别 待完成
    修改类别 待完成
    新增类别 待完成
    删除类别 待完成
    登录
    注销(安全退出)


    ==================================================================================
    注意:对于jsp页面默认会在进入页面时调用 request.getSession() 会导致session被创建
    如果不希望jsp页面主动创建session
    <%@ page ... session="false" %>


    =================================== day6 ========================================
    1. 数据库连接池

    DriverManager.getConnection(url, 用户名, 密码)

    原因:1)如果对创建连接没有做限制,会拖垮数据库
    2)数据库连接频繁打开和关闭,占用很多不必要的时间


    需要对数据库连接上限做限制, 最好数据库连接不要频繁打开关闭


    1)配置tomcat连接池 (dbcp 连接池) pool
    找到tomcat文档:jdbc dataSource (它对应java中的连接池接口) 也叫数据源

    tomcat安装目录/conf/context.xml, 进行如下配置:
    <!-- resource 是配置数据源(连接池)
    name = 名字 (可以出现/字符)
    type="javax.sql.DataSource" 写死的,表示连接池使用的接口
    driverClassName ="驱动类名"
    url = "连接字符串"
    username ="用户名"
    password ="密码"
    maxActive ="连接上限"
    maxIdle ="空闲连接数" 指最少保持多少个空闲连接
    maxWait ="没有空闲连接时的等待时间" -1 表示一直等待 (单位秒)
    -->
    <Resource name="jdbc/myoracle" auth="Container"
    type="javax.sql.DataSource" driverClassName="oracle.jdbc.OracleDriver"
    url="jdbc:oracle:thin:@127.0.0.1:1521:xe"
    username="hr" password="hr" maxActive="5" maxIdle="3"
    maxWait="-1"/>

    2) 将数据库 ojdbcxx.jar 放入tomcat安装目录/lib

    3)通过java代码从连接池获取连接
    Context // jndi (java命名和目录服务) 所有应用程序能够共享对象的一个作用域
    // tomcat在启动时,会创建 DataSource对象并放入 Context

    Context initContext = new InitialContext();
    // lookup(" java:/comp/env" + resource中的name);
    DataSource ds = (DataSource)initContext.lookup("java:/comp/env/jdbc/myoracle");

    Connection conn = ds.getConnection(); // 从连接池中获取连接

    conn.close(); // 没有真正关闭连接,仅仅是把连接还回连接池

    4) 更新一下JdbcUtil工具类

    包名全小写
    类名每个单词首字母大写
    变量名第一个单词首字母小写,其他单词首字母大写


    2. 过滤器 【重点】
    某些网页需要登录之后才能访问

    怎么检查是否登录
    在登录Servlet时向session中存储一个登录标记, 例如:
    session.setAttribute("username", username);
    其他servlet或jsp可以检查有没有这个登录标记,就能知道用户是否登录了

    步骤:
    1) java类要实现 Filter接口
    2) 实现doFilter方法

    3) 过滤器的配置
    <filter>
    <filter-name>checklogin</filter-name>
    <filter-class>day6.CheckLoginFilter</filter-class>
    </filter>

    <filter-mapping>
    <filter-name>checklogin</filter-name>
    <!-- 表示只要路径以/day6/开头,之后可以是任意的servlet或jsp -->
    <url-pattern>/day6/*</url-pattern>
    </filter-mapping>

    4) 在doFilter方法内部,要把父类接口转为子类接口
    5) 放行请求: chain.doFilter(request, response);
    将请求交给下一个过滤器,如果没有下一个过滤器,请求就会到达目标地址

    6) 如果有多个过滤器都匹配地址栏输入的路径,那么过滤器的执行顺序与配置先后顺序一致

    应用:
    1) 登录验证
    2) request.setCharaterEncoding("");
    <url-pattern>/*</url-pattern>
    3) 过滤器可以对响应内容(html)做修改
    gzip 压缩
    tomcat已经提供了这个过滤器

    =====================================================================================
    1. 验证码 【扩展内容】
    防止恶意重复注册用户
    下订单等一些重要操作之前,让用户填写一个验证码,以确保填写表单的是一个人,而不是一段代码

    2. 防止表单重复提交
    token 令牌 【扩展内容】


    ========================================= day 7========================================
    jsp 相关知识:
    目的:用来返回一个html响应,可以配合 <c:forEach>, EL表达式生成动态内容

    1. JSTL java standard(标准) tag (标签) library (库)
    1)【重点】 <c:forEach items="${集合}" var="临时变量名"
    begin="起始下标从0开始" end="结束下标" step="步长" varStatus="Status变量">
    Status变量 有个count属性,用来实现计数功能

    list, set, map, 数组


    1) 生成一个99乘法表
    2) 奇数行用红色显示,偶数行用蓝色显示

    2)【重点】 <c:if test="条件">
    里面的内容
    <c:/if>
    注意:没有else标签,必须通过一个条件完全相反的if标签来实现 else
    <c:if test="!条件">

    </c:if>
    当条件为真,会输出if标签之间的内容,否则不会输出

    el表达式中的逻辑运算符和比较运算符
    取非 ! 或 not
    或者 || 或 or
    并且 && 或 and
    判断相等 == 或 eq
    大于 > 或 gt
    小于 < 或 lt
    大于等于 >= 或 ge
    小于等于 <= 或 le
    不等于 != 或 ne
    empty 检查"非空"
    null 属于空 , "" 属于空 集合.size()==0 属于空

    3) 【了解】 <c:choose>
    <c:when test="条件"></c:when>
    <c:when test="条件"></c:when>
    ...
    <c:otherwise></c:otherwise> 否则
    </c:choose>

    4) 【了解】其他标签:
    格式化标签
    <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="f"%>

    函数标签:
    <%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
    ${ fn:函数名() }

    length(字符串或集合或数组) 求长度


    2. EL 表达式中的隐式对象
    pageScope 当前页面作用域 map
    requestScope 当前请求作用域 map
    sessionScope 会话作用域 map
    applicationScope 应用程序作用域 map

    param 代表所有请求参数的map集合
    key 请求参数名
    value 请求参数值

    cookie 代表所有cookie的map集合
    key cookie名
    value Cookie的对象
    .getName()
    .getValue() => value
    .getMaxage()
    pageContext 对象
    .getRequest() => HttpServletRequest
    request.getContextPath() 得到项目名
    动态获取当前项目名,建议以后表单、超连接路径,写项目名时使用:
    ${pageContext.request.contextPath}

    <c:set var="变量名" value="值" scope="page|request|session|application"/>
    如果scope不写,默认值是page


    =============================================================================
    3. jsp 的工作原理【清楚】
    jsp 就是一个servlet

    转义 => *.jsp 代码 => *.java 代码
    编译 => *.java 代码 => *.class

    调用 jsp类中的 _jspService 方法来处理请求和响应

    响应的主要功能是生成html内容,并写入输出字符流

    但jsp内容发生修改,重新刷新页面,tomcat会重新执行转义、编译、包括调用_jspService

    4. 早期jsp

    4.1
    生成动态内容 ===> 是使用java来生成
    缺点: 可读性差,难以维护

    1) jsp script(脚本)
    <% 任意java代码 %>

    2) jsp 指令【重点】
    <%@ 指令 %>
    page
    tablib
    include 指令
    是将两个jsp的内容转义为一个servlet (静态包含)
    <%@ include file="/day7/3.jsp" %>
    只能包含jsp
    include 动作
    (动态包含)
    两个jsp分别转义成两个不同的servlet, 把两个servlet生成的响应内容合并在一起
    <jsp:include page="/day7/3.jsp"></jsp:include>
    可以包含servlet和jsp

    3) jsp 声明
    <%! 定义变量,或定义方法 %>

    4) jsp表达式
    <%= 变量或表达式 %>

    5) 动态内容的注释【重点】
    <%-- --%> 对动态内容的注释 标签, el 表达式等... 能够防止动态内容执行
    <!-- --> 对html静态内容的注释

    用jsp script(脚本) 和jsp表达式 生成一个99乘法表

    4.2 jsp动作
    <jsp:forward>
    request.getRequestDispatcher("...").forward(request,response);

    <jsp:include page="要包含的路径可以是servlet或jsp">【重点】
    request.getRequestDispatcher("...").include(request,response);


    4.3
    * 重定向的请求方式只能是get
    * 重定向传参数
    1) 借助session作用域, 重定向前存, 重定向后取
    2) 把要传递的参数,拼在重定向的地址之后
    servlet中:

    String n = URLEncoder.encode("中文", "utf-8");
    response.sendRedirect("/servlet/url-pattern?name=" + n);

    jsp中:
    <c:redirect url="/day7/2.jsp">
    <c:param name="name">张三</c:param>
    </c:redirect>

    =========================================================================================
    1.写出Servlet的生命周期的3个方法?
    // 构造方法
    init
    service
    destroy

    2.假定myservlet应用 下有一个url-pattern为/abc的程序,分别写出请求转发(forward)
    和重定向到该程序的代码,注意跳转过程中有一个name值需要传递。
    request.setAttribute("name", 值);
    request.getRequestDispatcher("/abc").forward(request, response);

    // 方法1
    request.getSession().setAttribute("name", 值);
    response.sendRedirect("/myservlet/abc");

    // 方法2
    response.sendRedirect("/myservlet/abc?name="+值);
    //中文要URLEncoder.decode(值, "字符集");

    Scope
    3.区分四个作用域,写出各自的特点

    EL page Scope 只限于当前页面 pageContext.setAttribute , getAttribute , ...

    EL requestScope 限于当前的请求 request.setAttribute...
    EL sessionScope 同一个客户端浏览器的一次会话 session
    EL applicationScope 同一个应用程序 application

    Context context = new InitialContext(); 同一个服务器(tomcat) JNDI
    context.lookup();

    4.简述session的实现原理。
    map集合
    .setAttribute() getAttribute removeAttribute()
    request.getSession()
    session.invalidate()
    会话跟踪原理
    cookie tomcat => jsessionid 返回给客户端浏览器


    5.定义并配置一个filter,将“/abc”程序的请求和响应的编码方式调整为UTF-8.

    public class EncodingFilter implements Filter { // 1分

    public void doFilter(ServletRequest req, ServletReponse resp, FilterChain chain) {// 1分

    // 1分
    HttpServletRequest request = (HttpServletRequest) req;
    HttpServletReponse respnose = (HttpServletReponse) resp;

    // 1分
    // 请求
    request.setCharacterEncoding("字符编码集"); // 解决post请求的中文乱码

    // 1分
    // 响应
    response.setCharacterEncoding("字符编码集");

    // 1分
    chain.doFilter(request, response);
    }
    }

    2 分
    <filter>
    <filter-name>encoding</filter-name>
    <filter-class>EncodingFilter</filter-class>
    </filter>
    <filter-mapping>
    <filter-name>encoding</filter-name>
    <url-pattern>/abc</url-pattern>
    </filter-mapping>

    ============================================day 8==========================================
    1. jsp 中的隐式对象
    写在这两个标签之内
    <%%>
    <%=%>
    因为这些对象在jsp脚本和jsp表达式中,都不需要声明,就可以使用,因此称为"隐式"对象

    9大隐式对象
    作用域(4个)
    pageContext (页面作用域)
    .setAttribute()
    .getAttribute()
    .removeAttribute()
    .findAttribute()
    => 会依次查找page, request, session, application

    request (HttpServletRequest)
    session (HttpSession)
    application (ServletContext)
    跟响应相关(2个)
    response (HttpServletResponse 响应对象)
    out (JspWriter 响应的字符输出流)
    其它
    page this (jsp页面对应的java对象)
    config (ServletConfig) servlet配置对象
    它对应着<servlet>标签中的一段配置,
    主要用来获取初始化参数的值
    <servlet>
    ...
    <init-param>
    <param-name>参数名</param-name>
    <param-value>参数值</param-value>
    </init-param>
    </servlet>

    exception 当 <%@ page ... isErrorPage="true" %>
    表示当前页面是一个错误页面


    el 表达式隐式对象
    ${pageScope }
    ${requestScope }
    ${sessionScope }
    ${applicationScope }
    ${cookie }
    ${param }
    ${pageContext.request.contextPath } 获取项目名


    =================================================================================================
    1. 多条件组合查询
    页面(条件表单) 查询结果
    2. 购物车
    购物车类




  • 相关阅读:
    cast() 函数进行类型转换
    '+' 拼接字符串引起的小事故
    shell统计ip访问情况并分析访问日志
    Windows 环境上域名配置
    WebApi中Route的作用
    Postman测试WebApi使用总结
    C# VS2017新建WepApi
    C# 反射总结
    winform--同一个项目窗体复制
    winform TextBox设置透明
  • 原文地址:https://www.cnblogs.com/lovenannan/p/9711974.html
Copyright © 2011-2022 走看看