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:8080Servlet作用
获取用户提交的数据
获取浏览器附加信息
处理数据(访问数据库或调用接口)
给浏览器产生一个响应
在响应中添加附加信息HttpServletRequest对象
HttpServletRequest 对象代表客户端浏览器的请求,当客户端浏览器通过 HTTP 协议访问服务器时,HTTP 请求中的所有信息都会被 Tomcat 所解析并封装在这个对象中,通过这个对象提供的方法,可以获得客户端请求的所有信息。获取请求信息
req.getRequestURL()返回客户端浏览器发出请求时的完整 URL。req.getRequestURI()返回请求行中指定资源部分。req.getRemoteAddr()返回发出请求的客户机的 IP 地址。req.getLocalAddr()返回 WEB 服务器的 IP 地址。req.getLocalPort()返回 WEB 服务器处理 Http 协议的连接器所监听的端口。
获取请求数据
HttpServletResponse对象
设置响应编码
response.setCharacterEncoding("utf-8");设置服务端为浏览器产生响应的响应编码,服务端会根据此编码将响应内容的字符转换为字节。response.setContentType("text/html;charset=utf-8");设置服务端为浏览器产生响应的响应编码,服务端会根据此编码将响应内容的字符转换为字节。同时客户端浏览器会根据此编码方式显示响应内容。
在响应中添加附加信息
重定向响应
response.sendRedirect(URL 地址)重定向响应会在响应头中添加一个 Location 的 key ,对应的 value 是给定的 URL。客户端浏览器在解析响应头后自动向 Location 中的 URL 发送请求。重定向响应特点:重定向会产生两次请求两次响应。重定向的 URL 是有*客户端浏览器*发送的。
自启动Servlet
特点
自启动Servlet:Tomcat容器启动,实例化Servlet
普通Servlet:Servlet实例化过程依赖于请求
用途
通过自启动Servlet读取配置信息
//可以通过在 web.xml 中的<servlet>标签中通过 <load-on-startup>1</load-on-startup> 配置自启动 Servlet。public void init() throws ServletException {//servletConfig对应web.xml一个servlet,servlet初始化,该//servlet会将配置信息封装到servletConfig对象中ServletConfig servletConfig = this.getServletConfig();//通过ServletConfig对象获取该servlet配置信息String path = servletConfig.getInitParameter("path");//将该servlet的配置信息 添加到 servletContext全局容器中ServletContext servletContext = this.getServletContext();servletContext.setAttribute("path",path);}
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中的属性
@WebInitParam中的属性

//通过注解方式读取Servlet的初始化配置信息@WebServlet(urlPatterns = "/initParam.do",initParams = {@WebInitParam(name = "key1",value = "value2"),@WebInitParam(name = "key2",value = "value2")},loadOnStartup = 1)@Overridepublic void init() throws ServletException {ServletConfig servletConfig = this.getServletConfig();}
文件上传
//Part 对象处理文件上传//在 Servlet3.0 以及之后的版本中实现文件上传时必须要在 Servlet 中开启多参数配置//注解@MultipartConfig属性名 类型 描述fileSizeThreshold int 当数据量大于该值时,内容将被写入临时文件。location String 存放生临时成的文件地址maxFileSize long 允许上传的文件最大值(byte)。默认值为 -1,表示没有限制maxRequestSize long 一个 multipart/form-data 请求能携带的最大字节数(byte),默认值为 -1,表示没有限制。Part 对象中常用的方法String getContentType()获取上传文件的文件的 MIME 类型long getSize()上传文件的大小String getSubmittedFileName()上传文件的原始文件名String getName()获取<input name="upload" ...>标签中 name 属性值String getHeader(String name)获取请求头部Collection<String> getHeaderNames()获取所有请求头部名称InputStream getInputStream()获取上传文件的输入流void write(String path)保存文件至服务器
文件上传案例
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>Title</title></head><body><form action="fileupload.do" method="post" enctype="multipart/form-data">文件描述:<input type="text" name="desc"/>上传文件:<input type="file" name="file"/><input type="submit" value="OK"/></form></body></html>
@WebServlet("/fileupload.do")@MultipartConfigpublic class FileUploadServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {this.doPost(req, resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {req.setCharacterEncoding("utf-8");String desc = req.getParameter("desc");Part part = req.getPart("file");//给文件改名String fileName = UUID.randomUUID().toString()+part.getSubmittedFileName().substring(part.getSubmittedFileName().lastIndexOf("."));//路径转换ServletContext servletContext = this.getServletContext();String realPath = servletContext.getRealPath("images/" + fileName);//part自动处理字符字节流part.write(realPath);//响应界面resp.setContentType("text/html;charset=utf-8");PrintWriter out = resp.getWriter();out.println("<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.0 Transitional//EN'>");out.println("<HTML>");out.println("<HEAD><TITLE> ITBZ </TITLE></HEAD>");out.println("<BODY>");out.println("上传成功!"+desc);out.println("</BODY>");out.println("</HTML>");out.flush();out.close();}}
