Tomacat是一个Web服务器:
封装HTTP协议操作,简化开发;
可以将web项目部署到服务器中,对外提供网上浏览服务。

image.png

Tomcat 部署项目

将项目放置到 webapps目录下,即部署完成。
image.png

IDEA中使用 Tomcat方式1 – 部署Web项目

image.png

Servlet

Servlet 是 Java提供的一门动态web资源开发技术。(动态资源)

Servlet 快速入门

image.png上述的访问地址:http://localhost:8080/web-demo/demo1
http://localhost:8080为找到tomcat
web-demo为找到模块
demo1为找到Servlet

1.Servlet 由谁创建?Servlet方法由谁调用?
答:Servlet由web服务器创建,Servlet方法由web服务器调用。
2.服务器怎么知道Servlet中一定有service方法?
答:因为我们自定义的Servlet,必须实现Servlet接口并复写其方法,而Servlet接口中有service方法。

Servlet生命周期

实现Servlet接口时重写的三个方法:
image.png
比如,一个人出生(init),吃饭(service),死亡(destroy)。
若要在Servlet未被执行时就进行init()初始化,则:

image.png

Servlet 体系结构

image.png
image.png

快速新建类继承HttpServlet:
image.png
然后就会自动生成代码:
image.png
HttpServlet原理:获取请求方式,并根据不同的请求方式,调用不同的doXXX方法。

Servlet urlPattern配置

@WebServlet有两种方式写:
1.@WebServlet的value属性配置Servlet的访问路径—@WebServlet(value =”/demo04”)
2.@WebServlet的urlPatterns属性配置Servlet的访问路径—@WebServlet(urlPatterns = “/demo04”)
一个Servlet可以配置多个访问路径—@WebServlet({“/demo041”,”/demo042”})
value,urlPatterns都可以省略!

urlPattern配置规则:
image.png
前缀匹配(目录匹配)和后缀匹配(扩展名匹配)不能同时出现在一个地址中,否则会出现异常。

用XML配置Servlet

Servlet 从3.0版本后开始支持使用注解配置,3.0版本前只支持 XML 配置文件的配置方式。
步骤:
1.给Servlet取名字;
2.给Servlet配置访问路径。
具体操作如下:
image.png在web.xml中编写
image.png

Request获取请求数据

Request 继承体系

image.png
1.Tomcat需要解析请求数据,封装为request对象,并且创建request对象传递到service方法中;
2.使用request对象,查阅JavaEE API文档的HttpServletRequest接口。

请求数据方法

image.png

请求行

  1. // 演示Request获取请求数据
  2. // 浏览器访问: /req2.html
  3. @WebServlet("/req02")
  4. public class RequestDemo02 extends HttpServlet {
  5. @Override
  6. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  7. //请求行:GET
  8. // String getMethod():获取请求方式 GET
  9. System.out.println("getMethod:"+request.getMethod());
  10. // String getContextPath():获取项目(模块)访问路径 /day24
  11. System.out.println("getContextPath:"+request.getContextPath());
  12. // StringBuffer getRequestURL(): 获取URL http://localhost:8080/day24/req02
  13. System.out.println("getRequestURL:"+request.getRequestURL());
  14. // String getRequestURI():获取URI /day24/req02
  15. System.out.println("getRequestURI:"+request.getRequestURI());
  16. // String getQueryString():获取请求参数 username=42323&password=&hobby=1
  17. System.out.println("getQueryString:"+request.getQueryString());

上面代码重点是:getMethod()、getContextPath()

请求头

  1. // String getHeader(String name):通过请求头的名字得到请求头的值
  2. // 获取请求头:user-agent: 浏览器的版本信息
  3. System.out.println("User-Agent:"+request.getHeader("User-Agent"));

请求体

  1. // 浏览器输入地址都是get请求,目前只有form表单才能进行post请求
  2. @Override
  3. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  4. System.out.println("POST");
  5. // 获取 post 请求体
  6. // 1.获取字符输入流
  7. BufferedReader reader = request.getReader();
  8. // 2.读取数据(获得post请求体)
  9. String str = reader.readLine();//读取一行
  10. System.out.println("str = " + str);
  11. }
  12. }

同时要会在浏览器上的调试页面查数据:image.png

通用方式获取请求参数

该方式能更方便的获取请求的参数值!
image.png

// 演示Request通用方式获取请求参数
// 浏览器访问: /req3.html
@WebServlet("/req03")
public class RequestDemo03 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 我们可以在doPost中直接调用doGet
        doGet(request, response);
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 1.Map<String, String[]> getParameterMap():获取所有参数Map集合
        Map<String, String[]> map = request.getParameterMap();
        map.forEach((k,v)->{
            System.out.println(k+"::"+Arrays.toString(v));
        });

        System.out.println("--------------------------------------");
        // 2.String getParameter(String name):根据名称获取参数值(单个值)
        String username = request.getParameter("username");
        System.out.println("username = " + username);
        String password = request.getParameter("password");
        System.out.println("password = " + password);

        System.out.println("--------------------------------------");
        // 3.String[] getParameterValues(String name) :根据名称获取参数值(数组)
        String[] hobbies = request.getParameterValues("hobby");
        System.out.println("Arrays hobbies = " + Arrays.toString(hobbies));
    }
}

Request解决POST请求参数中文乱码问题

image.png
_//解决POST请求参数乱码问题(注意;必须要放在获取请求参数前设置编码)
_request.setCharacterEncoding(“UTF-8”);

请求转发

请求转发(forward):一种在服务器内部的资源跳转方式。
image.png

在请求页面中编辑:image.png
在转发页面中编辑:
image.png
请求转发特点:
1.浏览器地址栏路径不发生变化
2.只能转发到当前服务器的内部资源
3.一次请求,可以在转发的资源间使用request共享数据

使用 response对象来设置响应数据

Response 完成重定向

image.png

// 演示Response设置响应数据功能
// 浏览器访问: /resp01
@WebServlet("/resp01")
public class ResponseDemo01 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("resp01....");
        // 重定向,方法一
        // 1.设置响应状态码 302
        response.setStatus(302);//我不行
        // 2.设置响应头 Location
        response.setHeader("Location","resp02");//你找他

        // 简化方式完成重定向, 资源路径可以直接写: "resp02"   方法二
        response.sendRedirect("resp02");
    }
}

重定向特点:
浏览器地址栏路径发生变化;
可以重定向到任意位置的资源(服务器内部、外部均可);
两次请求,不能在多个资源使用request共享数据。

image.png

路径问题

image.png

Response 响应字符数据

 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 0.设置响应编码,本质是设置了响应头;设置打印流的编码为UTF-8;告诉浏览我们的响应的是html网页,编码是UTF-8
        response.setContentType("text/html;charset=utf-8");
        // 1.获取字符输出流
        PrintWriter writer = response.getWriter();
        // 2.写数据到流中
        writer.write("<h1>来自服务器的问题</h1>");
        // 细节:流不需要关闭, Web服务器会处理
    }
}

注意:
•该流不需要关闭,随着响应结束,response对象销毁,由服务器关闭
•中文数据乱码:原因通过Response获取的字符输出流默认编码:ISO-8859-1,
image.png

Response 响应字节数据


    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 1.读取文件
        // 获取资源在Tomcat中的路径   Web项目写资源路径以webapp作为参照
        String realPath = request.getServletContext().getRealPath("imgs/Desert.jpg");
        System.out.println("realPath = " + realPath);
        FileInputStream fis = new FileInputStream(realPath);
        // 2.获取response字节输出流
        ServletOutputStream out = response.getOutputStream();
        // 3.完成流的copy
        /*byte[] buf=new byte[1024*8];
        int len;
        while((len=fis.read(buf))!=-1){
            out.write(buf,0,len);
        }*///这种方式可以用commons io中的IOUtils.copy方法代替,如下
        IOUtils.copy(fis,out);
        // 4.关闭
        fis.close();
    }

图片资源的地址要用这里的image.png

综合案例

用户登录

效果:image.png
思路如下:
image.png
流程说明:
1.用户填写用户名密码,提交到 LoginServlet;
2.在 LoginServlet中使用 MyBatis查询数据库,验证用户名密码是否正确;
如果正确,响应“登录成功”,如果错误,响应“登录失败”。
image.png
具体步骤如下:(还需要MyBatis环境和MySQL的数据)
hh.png

用户注册

流程说明:
1.用户填写用户名、密码等信息,点击注册按钮,提交到 RegisterServlet;
2.在 RegisterServlet中使用 MyBatis 保存数据;保存前,需要判断用户名是否已经存在:根据用户名查询 数据库。
image.png
具体步骤如下:
hh.png