Tomcat

基本使用

下载(直接解压即可)

IDEA中Tomcat运行时output输出中文乱码现象:

1.启动信息有中文乱码:

之前解决windows下启动中文乱码造成的影响,当前IDEA已经改成utf-8了,此时仅仅需要将 其改回utf-8格式即可。
windows下乱码原因是tomcat采用的是utf-8,而windows默认是GBK
在tomcat目录下的conf文件夹中,打开logging.properties文件
修改其中的配置:java.util.logging.ConsoleHandler.encoding = GBK
重启tomcat,即可解决控制台中文乱码。

2.servlet中标注的System.out.println()打印出来的信息有中文乱码:

在tomcat的VM Options中加入-Dfile.encoding=UTF-8,Apply即可

tomcat启动运行

  • Tomcat 启动 运行bin 目录中的命令脚本startup.bat文件
  • Tomcat 关闭 运行shutdown.bat文件直接关闭掉启动窗口。

    访问 Tomcat

  • 访问 Tomcat 的 URL 格式:http://ip:port

  • 访问本机 Tomcat 的 URL 格式:http://localhost:8080

    Servlet作用

    获取用户提交的数据
    获取浏览器附加信息
    处理数据(访问数据库或调用接口)
    给浏览器产生一个响应
    在响应中添加附加信息

    HttpServletRequest对象

    HttpServletRequest 对象代表客户端浏览器的请求,当客户端浏览器通过 HTTP 协议访问服务器时,HTTP 请求中的所有信息都会被 Tomcat 所解析并封装在这个对象中,通过这个对象提供的方法,可以获得客户端请求的所有信息。

    获取请求信息

    1. req.getRequestURL()
    2. 返回客户端浏览器发出请求时的完整 URL
    3. req.getRequestURI()
    4. 返回请求行中指定资源部分。
    5. req.getRemoteAddr()
    6. 返回发出请求的客户机的 IP 地址。
    7. req.getLocalAddr()
    8. 返回 WEB 服务器的 IP 地址。
    9. req.getLocalPort()
    10. 返回 WEB 服务器处理 Http 协议的连接器所监听的端口。

    获取请求数据

HttpServletResponse对象

设置响应编码

  1. response.setCharacterEncoding("utf-8");
  2. 设置服务端为浏览器产生响应的响应编码,服务端会根据此编码将响应内容的字符转换
  3. 为字节。
  4. response.setContentType("text/html;charset=utf-8");
  5. 设置服务端为浏览器产生响应的响应编码,服务端会根据此编码将响应内容的字符转换
  6. 为字节。同时客户端浏览器会根据此编码方式显示响应内容。

在响应中添加附加信息

重定向响应

  1. response.sendRedirect(URL 地址)
  2. 重定向响应会在响应头中添加一个 Location key ,对应的 value 是给定的 URL。客户端浏览器在解析响应头后自动向 Location 中的 URL 发送请求。
  3. 重定向响应特点:
  4. 重定向会产生两次请求两次响应。
  5. 重定向的 URL 是有*客户端浏览器*发送的。

自启动Servlet

特点

自启动Servlet:Tomcat容器启动,实例化Servlet
普通Servlet:Servlet实例化过程依赖于请求

用途

通过自启动Servlet读取配置信息

  1. //可以通过在 web.xml 中的<servlet>标签中通过 <load-on-startup>1</load-on-startup> 配置自启动 Servlet。
  2. public void init() throws ServletException {
  3. //servletConfig对应web.xml一个servlet,servlet初始化,该
  4. //servlet会将配置信息封装到servletConfig对象中
  5. ServletConfig servletConfig = this.getServletConfig();
  6. //通过ServletConfig对象获取该servlet配置信息
  7. String path = servletConfig.getInitParameter("path");
  8. //将该servlet的配置信息 添加到 servletContext全局容器中
  9. ServletContext servletContext = this.getServletContext();
  10. servletContext.setAttribute("path",path);
  11. }

Servlet线程安全问题

在 Servlet 中使用的是多线程方式来执行 service()方法处理请求,所以我们在使用 Servlet 时需要考虑到线程安全问题,在多线程中对于对象中的成员变量是最不安全的,所以不要在 Servlet 中通过成员变量的方式来存放数据(比如两个线程同时请求成员变量PrintWrite,而先执行的完的线程把PrintWrite关闭了,另一个线程无法执行PrintWrite的操作),如果一定要使用成员变量存储数据,在对数据 进行操作时需要使用线程同步的方式来解决线程安全问题,避免出现数据张冠李戴现象。

Servlet的url-pattern配置

web.xml主要配置信息

将一个url映射到servlet中,就可以通过绑定的url请求Servlet,通过实现绑定

基于注解式开发Servlet

对于Servlet的配置(url映射到servlet)不在依赖于web.xml配置文件,而是使用@WebServlet注解完成Servlet配置

@WebServlet中的属性

image.png

@WebInitParam中的属性

image.png

  1. //通过注解方式读取Servlet的初始化配置信息
  2. @WebServlet(urlPatterns = "/initParam.do",initParams = {@WebInitParam(name = "key1",value = "value2"),@WebInitParam(name = "key2",value = "value2")},loadOnStartup = 1)
  3. @Override
  4. public void init() throws ServletException {
  5. ServletConfig servletConfig = this.getServletConfig();
  6. }

文件上传

  1. //Part 对象处理文件上传
  2. //在 Servlet3.0 以及之后的版本中实现文件上传时必须要在 Servlet 中开启多参数配置
  3. //注解@MultipartConfig
  4. 属性名 类型 描述
  5. fileSizeThreshold int 当数据量大于该值时,内容将被写入临时文件。
  6. location String 存放生临时成的文件地址
  7. maxFileSize long 允许上传的文件最大值(byte)。默认值为 -1,表示没有限制
  8. maxRequestSize long 一个 multipart/form-data 请求能携带的最大字节数(byte),默认值为 -1,表示没有限制。
  9. Part 对象中常用的方法
  10. String getContentType()
  11. 获取上传文件的文件的 MIME 类型
  12. long getSize()
  13. 上传文件的大小
  14. String getSubmittedFileName()
  15. 上传文件的原始文件名
  16. String getName()
  17. 获取<input name="upload" ...>标签中 name 属性值
  18. String getHeader(String name)
  19. 获取请求头部
  20. Collection<String> getHeaderNames()
  21. 获取所有请求头部名称
  22. InputStream getInputStream()
  23. 获取上传文件的输入流
  24. void write(String path)
  25. 保存文件至服务器

文件上传案例

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. <form action="fileupload.do" method="post" enctype="multipart/form-data">
  9. 文件描述:<input type="text" name="desc"/>
  10. 上传文件:<input type="file" name="file"/>
  11. <input type="submit" value="OK"/>
  12. </form>
  13. </body>
  14. </html>
  1. @WebServlet("/fileupload.do")
  2. @MultipartConfig
  3. public class FileUploadServlet extends HttpServlet {
  4. @Override
  5. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  6. this.doPost(req, resp);
  7. }
  8. @Override
  9. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  10. req.setCharacterEncoding("utf-8");
  11. String desc = req.getParameter("desc");
  12. Part part = req.getPart("file");
  13. //给文件改名
  14. String fileName = UUID.randomUUID().toString()+part.getSubmittedFileName().substring(part.getSubmittedFileName().lastIndexOf("."));
  15. //路径转换
  16. ServletContext servletContext = this.getServletContext();
  17. String realPath = servletContext.getRealPath("images/" + fileName);
  18. //part自动处理字符字节流
  19. part.write(realPath);
  20. //响应界面
  21. resp.setContentType("text/html;charset=utf-8");
  22. PrintWriter out = resp.getWriter();
  23. out.println("<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.0 Transitional//EN'>");
  24. out.println("<HTML>");
  25. out.println("<HEAD><TITLE> ITBZ </TITLE></HEAD>");
  26. out.println("<BODY>");
  27. out.println("上传成功!"+desc);
  28. out.println("</BODY>");
  29. out.println("</HTML>");
  30. out.flush();
  31. out.close();
  32. }
  33. }