• jsp、servlet笔记


    1、init    初始化Jsp&Servlet方法
       destroy 销毁Jsp&Servlet之前的方法
       service 对用户请求生成响应的方法
    2、Jsp文件必须在jsp服务器内运行
       Jsp文件必须生成servlet执行
       每个jsp页面的第一个访问者速度很慢,因为必须等待jsp编译为servlet
       jsp页面的访问者无需安装任何客户端,甚至不需要java的运行环境,因为jsp页面输送到客户端的是标准的html页面
    3、jsp注释:<%-- 注释内容 --%>
       html注释:<!-- 注释内容 -->
       jsp声明:<%!
    声明部分
    %>
       jsp输出表达式:<%= jsp表达式 %>
    4、通过jsp声明语法定义的变量和语法对应于servlet类里面的成员变量和方法,jsp脚本部分会转换为_jspService方法内的可执行代码,所以jsp脚本中不能定义方法,因为java不允许在方法内部定义方法
    5、jsp三个编译指令:page 针对当前页面的指令
    include 包含另一个页面(静态包含,会把被包含界面的编译指令也包含进来,但是动态的<jsp:include>不会)
    taglib 用于定义和访问自定义标签
    6、jsp的七个动作指令:

    <jsp:forward page="">
    <jsp:param name="" value="">
    </jsp:forward>  参数传递
    <jsp:include> 动态包含(仅导入页面body内容)
    <jsp:plugin> 用于下载javaBean或者Applet到客户端执行
    <jsp:userBean> 创建javaBean实例
    <jsp:setProperty> 设置javaBean实例的属性值
    <jsp:getProperty> 输出javaBean实例的属性值

    --------------------------------------------------------------------------------------------------------------
    ps: 执行forward时,用户请求的url不会发生改变,转发时客户端的请求参数不会丢失,但页面内容完全被forward目标页内容  所取代。相当于用新页面来生成或处理用户请求,所以请求参数、属性的信息不会丢失。
    ps:静态导入和动态导入的区别:
    1、静态导入是完全融合,两个页面融合为一个servlet;而动态导入则在servlet中使用include方法来引入被导入页面的b ody内容;
    2、静态导入时被导入页面的编译指令会起作用,动态导入不会;
    3、动态包含可以追加额外参数;
    --------------------------------------------------------------------------------------------------------------
    7、jsp中的九个内置对象
    application(让多个jsp、servlet共享数据)、config(可以获取servlet在web.xml文件中的配置参数——config.getInitParameter("paramName"))、exception、request、response、out(输出流对象,out.write(...)等价于<%= jsp表达式 %>)、session、page、pageContext


    ps:四个map结构:page、request、session、application
    8、在web.xml文件中配置application(servletContext实例)级别变量——在jsp中通过application.getInitParameter("driver")访问:

    配置application级别变量:

    <context-param>
    <param-name>driver</param-name>
    <param-value>com.mysql.jdbc.Driver</param-value>
    </context-param>


    配置servlet初始化参数:

    <servlet>
    <init-param>
    <param-name>name</param-name>
    <param-value>jack</param-value>
    </init-param>
    </servlet>


    9、PageContext内置对象:
    代表页面上下文,用于访问jsp之间的共享数据,使用PageContext可以访问page、request、session、application范围的变量
    getAttribute(String name)
    setAttribute(String name,int scope),scope可以是如下四个值:PageContext.PAGE_SCOPE、PageContext.REQUEST_SCOPE、PageContext.SESSION_SCOPE、PageContext.APPLICATION_SCOPE

    PageContext.getRequest、PageContext.getResponse、PageContext.getServletConfig、
    PageContext.getServletContext、PageContext.getSession

    10、request对象:
    获取请求头、请求参数;操作request范围的属性;
    --------------------------------------------------------------
    执行forward或者include——代替jsp提供的forward或者include指令。
    HttpServletRequest类提供了一个getRequestDiapatcher(String path)(Path必须以"/开始")方法,
    其中path就是希望forward或include的目标路径,该方法返回RequestDispatcher对象。该对象提供以下两个方法:

    -> forward(ServletRequest request,ServletResponse response); //forward到path下页面
    -> include(ServletRequest request,ServletResponse response); //将path页面include到本页面


    ------------------------------------------------------------------
    11、response对象:
    生成非字符响应(jsp的out对象属于JspWritter类,属于字符流的形式),对于字节流输出可以使用response
    重定向:response.sendRedirect("")
    增加cookie:

    <%
    String name = request.getParameter("name");
    Cookie cookie = new Cookie("userName",name);
    cookie.setMaxAge(24 * 3600);//设置cookie有效期为24h,如果不设置,则web应用关闭时cookie自动失效
    response.addCookie(cookie);
    %>
    <%-- 获取本站保留的用户cookie --%>
    <%
    Cookie[] cookies = request.getCookies();
    for(Cookie c: cookies){             //遍历cookie查找输出
    if(c.getName().equals("userName")){
    out.println(c.getValue());
    }
    }
    %>


    如果cookie中出现中文字符,则必须使用java.net.URLEncoder进行编码,然后使用java.net.URLDecoder对其进行解码:

    <%
    //使用java.net.URLEncoder.encode进行编码
    Cookie c = new Cookie("cnName",java.net.URLEncoder.encode("孙悟空"),"GBK");
    cookie.setMaxAge(24 * 3600);//设置cookie有效期为24h,如果不设置,则web应用关闭时cookie自动失效
    response.addCookie(cookie);
    
    //获取cookie
    Cookie[] cookies = request.getCookies();
    for(Cookie c: cookies){             //遍历cookie查找输出
    if(c.getName().equals("userName")){
    //使用java.net.URLDecoder.decode进行解码
    out.println(java.net.URLDecoder.decode(c.getValue()));
    }
    }
    %>


    12、session对象:主要用于跟踪用户会话信息,如判断用户是否登录系统,或者在购物车应用中,用于跟踪用户购买的商品。
    session范围的属性可以是多个页面的跳转之间共享,主要有setAttribute(String attName,Object attValue)、
    getAttribute(String attName)两个常用方法。
    session机制通常用于保存客户端的状态信息,这些状态信息需要保存到web服务器的硬盘上,所以要求session里的属性值必须是可序列化的,否则会引发不可序列化的异常。session的属性值可以是任何可序列化的java对象。
    13、servlet介绍
    servlet通常是服务端小程序,运行在服务器端,用于处理及响应客户端请求。
    servlet是个特殊的java类,这个类必须继承HttpServlet,servlet提供不同的方法来响应客户端请求:
    doGet、doPost、doPut、doDelete分别用于响应各自请求。一般只有doGet、doPost两种。
    大部分时候,servlet对于所有请求的响应都是一样的,此时,可以重写service()方法即可响应客户端的所有响应。
    另外HttpServlet包含另外两个方法:
    -> init(ServletConfig config) //创建servlet实例时,调用该方法初始化该servlet资源
    -> destroy() //销毁servlet时,自动调用该方法回收资源
    ps:普通servlet类里的service()方法的作用,完全等同于jsp生成servlet类的_jspService()方法。
    14、servlet的配置
    配置servlet有2种方式:

    -> 在servlet类中使用@WebServlet Annotation配置
    -> 在web.xml文件中配置
    <servlet>
    <servlet-name>aa</servlet-name>
    <servlet-class>org.Class</servlet-class>
    </servlet>
    <servlet-mapping>
    <servlet-name>aa</servlet-name>
    <url-pattern>/aa</url-pattern>
    </servlet-mapping>


    15、servlet的生命周期(servlet的创建销毁等都是由web容器决定)
    ->创建servlet实例->init()->完成初始化->响应客户请求->destroy()->资源回收完成->实例被销毁

    servlet创建有2个时机,用户请求之时、应用启动之时(通常用于某些后台服务的servlet,或者用于拦截请求的servlet)

    load-on-startup:

    ->它的值必须是一个整数,表示servlet应该被载入的顺序
    ->当值为0或者大于0时,表示在容器启动的时候就被加载并初始化
    ->当值小于0或者没有指定时,表示该servlet被选择调用的时候才会去加载
    ->正数的值越小,该servlet的优先级越高,应用启动就越先加载
    ->当值相同时,容器会自主选择相应servlet的加载顺序


    16、Filter介绍
    Filter可以认为是servlet的加强版,主要用于在request到达servlet之前进行预处理或者response到达客户端之前对response进行预处理操作。
    Filter主要分类:

    ->日志Filter:只要用于记录用户每次的请求操作
    ->用户授权的Filter:负责检查用户请求,过滤非法请求
    ->负责解码的Filter:包括对非标准编码的请求解码
    ->XSTL:能改变xml内容的XSTL Filter
    ->一个Filter可以拦截多个用户请求,一个请求也可以被多个Filter拦截

    创建Filter只需要:
    ->创建Filter类
    ->在web.xml文件中配置filter
    创建Filter必须实现的接口javax.servlet.Filter接口,该接口中定义了三个方法:

    ->init(FilterConfig config)  //在config对象中可以获取该filter的一些初始化参数,获取方法同servlet
    ->destory() //完成对filter销毁前资源的回收
    ->doFilter(HttpServletRequest request,HttpServletResponse response,FilterChain chain)  //doFilter方法中的代码实际就是从多个servlet中的service()方法中抽调出来的通用代码,通过利用filter可以很好地实现代码复用。


    17、Listener类
    创建listener步骤:
    ->创建listener实现类
    ->在web.xml文件中配置该listener
    常见的web事件监听器接口有以下几种:

    ->ServletContextListener,用于监听web应用的启动关闭,
    ->ServletContextAttributeListener,用于监听ServletContext(application)范围内属性的改变
    ->ServletRequestListener,用于监听用户请求
    ->ServletRequestAttributeListener,用于监听ServletRequest(request)范围的属性的改变
    ->HttpSessionListener,用于监听session的开始和结束
    ->HttpSessionAttributeListener,用于监听HttpSession(session)范围内属性的改变

    1)ServletContextListener

    <context-param>
            <param-name>name</param-name>
            <param-value>value</param-value>
      </context-param>
    
    ->contextInitialized(ServletContextEvent sce),启动web应用时调用
    ->contextDestroyed(ServletContextEvent sce),关闭web应用时调用


    配置Listener
    在listener实现类上添加注解@WebListener即可,或者在web.xml根目录中配置:

    <listener>
    <!-- 指定该listener的实现类 -->
    <listener-class></listener-class>
    </listener>
    
    ServletContextAttributeListener
    ->attributeAdded(ServletContextAttributeEvent event),将存入一个属性至application调用
    ->attributeRemoved(ServletContextAttributeEvent event),将一个属性从application范围中删除时调用
    ->attributeReplaced(ServletContextAttributeEvent event),将一个属性替换时调用


    2)ServletRequestListener和ServletRequestAttributeListener

    ServletRequestListener用于监听用户请求的到达,该接口的监听器需实现以下两个方法:
    ->requestInitialized(ServletRequestEvent event),用户请求到达、被初始化时调用
    ->requestDestroyed(ServletRequestEvent event),用户请求结束、被销毁时调用
    ServletRequestAttributeListener用于监听request范围内属性的变化,该接口下方法如下:
    ->attributeAdded(ServletRequestAttributeEvent event)
    ->attributeRemoved(ServletRequestAttributeEvent event)
    ->attributeReplaced(ServletRequestAttributeEvent event)  //event.getName() or getValue()获取属性名、值


    3)HttpSessionListener和HttpSessionAttributeListener

    ->sessionCreated(HttpSessionEvent event),用户与服务器的会话开始、创建时触发该方法
    ->sessionDestroyed(HttpSessionEvent event),用户服务器的会话断开、销毁时调用
    HttpSessionAttributeListener用于监听session范围内属性的变化,该接口下方法如下:
    ->attributeAdded(ServletRequestAttributeEvent event)
    ->attributeRemoved(ServletRequestAttributeEvent event)
    ->attributeReplaced(ServletRequestAttributeEvent event)


    18、表达式语言
    ${expression}
    在jsp页面中使用表达是语言可以直接获取请求参数值、获取javabean的指定属性值、获取请求头、获取各种范围属性值。
    表达式语言内置11种:

    ->pageContext,同jsp内置对象中的PageContext对象
    ->pageScrope,用于获取page范围的属性值
    ->requestScrope,用于获取request范围的属性值
    ->sessionScrope,用于获取session范围属性值
    ->applicationScrope,用于获取application范围属性值
    ->param,用于获取请求的参数值
    ->paramValues,用于获取属性为数组的属性值
    ->header,用于获取请求头的属性值
    ->headerValues,用于获取请求头的属性值维数组的属性值
    ->initParam,用于获取web应用的初始化参数,即<context-param></context-param>中的值
    ->cookie,用于获取cookie值


    19、servlet 3.0的文件上传
    表单文件form.jsp:

    <form method="post" action="upload" enctype="multipart/form-data">
    文件名:<input type="text" id="name" name="name" /></br>
    选择文件:<input type="file" id="file" name="file" />
    <input type="submit" value="上传" />
    </form>


    UploadServlet如下:

    @WebServlet(name="upload",urlPatterns={"/upload"})
    @MultipartConfig   //该注解指定该servlet用于处理文件上传请求
    public class UploadServlet extends HttpServlet{
    public void service(HttpServletRequest request,HttpServletResponse response) throws Exception{
    response.setContentType("text/html;charset=utf-8");
    PrintWriter pw = response.getWriter();
    //获取普通请求参数
    String fileName = request.getParameter("name");
    //获取上传文件域
    Part part = request.getPart("file");
    out.println("上传文件类型:"+ part.getContentType());
    out.println("上传文件大小:"+ part.getSize());
    //获取该文件上传域的Header Name
    Collection<String> headerNames = part.getHeaderNames();
    for(String headerName: headerNames){
    out.println(headerName + "---" + part.getHeader(headerName));
    }
    //将上传的文件写入服务器uploadFiles文件夹下面
    part.write(getServletContext().getRealPath("/uploadFiles") + "/" fileName);
    }
    }
  • 相关阅读:
    例行更新,防止被踢
    C语言 遍历磁盘目录
    析构函数的调用
    数组学习笔记
    函数学习笔记
    c++语言 纯虚函数的使用
    c++语言 内联方法
    复制构造函数
    c++语言 覆盖成员函数
    面向对象程序设计
  • 原文地址:https://www.cnblogs.com/vipzhou/p/4765547.html
Copyright © 2020-2023  润新知