导航

servlet学习笔记

Posted on 2019-04-14 20:00  李日天  阅读(150)  评论(0编辑  收藏  举报

操作环境IDEA

 

首先创建项目

 

创建完成后导入 java ee jar包

配置tomcat 

 

修改TomCat的默认访问页面

 

    <welcome-file-list>
        <welcome-file>xx.html</welcome-file>
    </welcome-file-list>

缺省的默认访问页面是index.html

也可以指定一个servlet来作为默认访问页面,前提是这个servlet可以推送一个网页。

 

 

在src下创建 com.xx.control包,servlet一般放在control下。一个简单的HttpServlet

package com.xx.control;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet(name = "TwoServlet")
public class TwoServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String mt = request.getMethod();
String uname = request.getParameter("uname");
System.out.println("用户名: "+ uname);
System.out.println("方法: " + mt);
}

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String mt = request.getMethod();
String uname = request.getParameter("uname");
System.out.println("用户名: "+ uname);
System.out.println("方法: " + mt);
}
}

 

 然后在web目录下配置WEB-INF中的web.xml

    <servlet>
        <servlet-name>WYF</servlet-name>
        <servlet-class>com.lh.control.OneServlet</servlet-class>
        <load-on-startup>10</load-on-startup>
        <!--    设置为启动tomcat时即加载该实例,数字越小 加载优先级越高    -->
        <!--    tomcat 访问期间,只会有一个servlet被实例化-->
    </servlet>

    <servlet-mapping>
        <servlet-name>WYF</servlet-name>
        <url-pattern>/wyf</url-pattern>
    </servlet-mapping>

有四种路径配置方法,当路径冲突时,优先级为   具体 > 前置 > 通配 > 后置

<!--        具体路径请求-->
        <url-pattern>/wyf</url-pattern>

<!--        前置条件请求-->
        <url-pattern>/wyf/*</url-pattern>

<!--        后置条件请求-->
        <url-pattern>*.do</url-pattern>

<!--        通配符请求路径-->
        <url-pattern>/*</url-pattern>

 

Response

为了给用户一个返回数据,我们需要使用HttpServletResponse

从相应对象获取一个输入流

通过输入流将返回结果写入到响应体中

关闭输入流

复制代码
public class ResponseServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String result = "Hello Java";
        PrintWriter out = resp.getWriter();
        out.println(result);
        out.close();
    }
}
复制代码

中文会乱码

还是因为默认的响应体编码是 ISO的

需要指定编码

resp.setCharacterEncoding("utf-8");

还可以指定ContentType。

resp.setContentType("text/html;charset=utf-8");

 

 

Cookie

Cookie ck = new Cookie("key", "value");
resp.addCookie(ck);

读取cookie

Cookie[] cookies = req.getCookies();

不好的是要获取key就只能循环出来,不能单独读取。后续学到了再来做补充。

 Session

通过在cookie中存一个session_id来确认用户身份。

 session创建方法

HttpSession hs = req.getSession();
HttpSession hs = req.getSession(false);
HttpSession hs = req.getSession(true);

getSession() 已有session则返回现有session,否则创建返回

getSession(true) 同上

getSession(false) 已有session则返回现有session,否则返回空

 

session保存数据

hs.setAttribute("key","value");
hs.getAttribute("key");

 

设置session的空闲时间

1)Tomcat中配置

    <session-config>
        <session-timeout>1</session-timeout>  
    </session-config>
<!-- 单位分钟 --!>

2)Servlet中配置

hs.setMaxInactiveInterval(120); #单位秒

 

ServletContext

ServletContext其实就是全局作用域对象, 上下文环境对象

利用context可以实现对,当前网站中所有的Servlet共享数据

context对象只能由Tomcat负责创建,在tomcat启动时创建,关闭时销毁

只能有一个context singleton。

使用

1)从request中获取

ServletContext application = req.getServletContext();

2)context中存放数据

  1)在tomcat中存放

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

  2) 在servlet中存放

application.setAttribute("name", "silly B");

   取

String name = (String) application.getAttribute("name");

注意事项

消耗的是服务器端的内存,所以不要随意往里面放东西。

 

Post时编码问题

<html>
  <body>
  <div>
    <form action="/Sample01/wyf" method="get">
      <label>用户名: </label><input type="text" name="uname"/>
      <input type="submit" value="get"/>
    </form>
    <form action="/Sample01/wyf" method="post">
      <label>用户名: </label><input type="text" name="uname"/>
      <input type="submit" value="post"/>
    </form>
  </div>
  </body>
</html>

使用post传参时会发现,tomcat在console的输出会乱码

原因

  浏览器采用【get】请求时,请求参数保存在【请求头】,请求头的内容是由tomcat负责的。Tomcat9 编码集默认为 utf-8, 以前也是ISO-8859-1

  浏览器采用【post】请求时,请求参数保存在【请求体】,请求体的内容是由请求对象负责的。编码集默认为 ISO-8859-1

解决方法

  设置request对象的编码

request.setCharacterEncoding("utf-8");

  必须在读取内容前调用该方法.

 

  Tomcat9以前的版本还需要修改Tomcat/conf/server.xml

<Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" 
           URIEncoding="utf-8"/>        

 

 

读取复选框的参数

String array[] = req.getParameterValues("hobby");

 

    <form action="/Sample01/cbs" method="get">
      <label>爱好: </label><input type="checkbox" name="hobby" value="1">吴亦凡<br>
      <input type="checkbox" name="hobby" value="2">才徐坤<br>
      <input type="checkbox" name="hobby" value="3">郭德纲<br>
      <input type="submit"/>
    </form>

测试结果

 

 

过滤器

创建

1.实现了Filter接口的实现类被认为是一个过滤器

2.重写doFilter方法,来过滤请求

3.webxml中注册过滤器通知tomcat

生命周期

启动时创建,一个过滤器只有一个实例对象,关闭时销毁。

public class myFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        String age = servletRequest.getParameter("age");
        if(Integer.valueOf(age)<18){
            servletResponse.getWriter().println("too young");
        }else {
            filterChain.doFilter(servletRequest, servletResponse); // 继续下一个filter
        }
    }
}

web.xml

    <filter>
        <filter-name>firstFilter</filter-name>
        <filter-class>com.lh.control.myFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>firstFilter</filter-name>
        <url-pattern>/18x.jpg</url-pattern> //还有通配符 前置 后置的匹配模式
    </filter-mapping>

应用:用filter设置编码集。 控制未登录用户访问页面

 

 

监听器

servlet中的监听器专门用于监控域对象(request,session,context)

 

public class MyListener implements ServletContextListener {

    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {

    }
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) { } }

web.xml中注册

    <listener>
        <listener-class>com.lh.control.MyListener</listener-class>
    </listener>