JavaWeb(Tomcat&Servlet)

该笔记来自B站SGG-JavaWeb学习纪录,文章末贴出链接

2022.04.25

如何修改tomcat在idea中乱码问题

https://blog.csdn.net/mr_liuhailong/article/details/110264765

如何解决tomcat热部署问题

https://blog.51cto.com/u_10624715/3234220

如何在idea里导包

https://blog.csdn.net/a755199443/article/details/89192230

如何创建Artifact+tomcat

https://blog.csdn.net/jakemanse/article/details/105874304
JavaWeb(Tomcat&Servlet)_第1张图片

什么是servlet
1. JavaEE规范之一,规范就是接口
2.JavaWeb三大组件之一:servlet程序、Filter过滤器、Listener监听器
3. 运行在服务器上的一个java小程序,"它可以接收客户端发送过来的请求,并相应数据给客户端"
如何通过"实现Servlet"来创建一个servlet程序(通过一个类来实现Servlet类)
1. 编写一个类去实现servlet接口 
    这里需要引入servlet包,一般包可以使用Tomcat的lib中的servlet-api.jar
    // 注意这里是实现了Servlet类 一般实际开发中 是扩展Servlet子类来操作
    public TestServlet implements Servlet{}

2. 实现service方法,处理请求,并相应数据
    // 专门用来处理请求和访问
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("进入servlet 访问的service方法");
    }

3. 需要到web.xml中去配置servlet程序的访问地址
    在<web-app>
    	// servlet标签的Tomcat配置servlet程序
    	<servlet>
    		// servlet-name标签:Servlet程序的一个别名(一般是类名)
    		<servlet-name>TestServlet</servlet-name>
   			// servlet-class标签:是Servlet程序的全类名
    		<servlet-class>com.kd.servlet.TestServlet</servlet-class>
    	</servelt>
        // servlet-mapping标签:表示给哪个servlet程序配置访问地址        
         <servlet-mapping>
             // servlet-name标签:告诉服务器,当前配置的地址给哪个servlet程序使用一般与上面的servlet-name配置项一致   
             <servlet-name>TestServlet</servlet-name>
            // url-pattern标签:配置访问地址 
            // "/":斜杠表示:服务器在解析的时候,地址为 http://ip:port/工程路径 (其中工程路径在Tomcat之前配置的application context值)
            // "/testServlet": http://ip:port/工程路径/testServlet (表示调用servlet-name中配置的Servlet程序)
             <url-pattern>/testServlet</url-pattern>
         </servlet-mapping>
      </web-app>

JavaWeb(Tomcat&Servlet)_第2张图片

Servlet生命周期
1. 执行构造器方法
2. 执行init初始化方法
	// 1、2步是在第一次访问的时候创建Servlet会调用
3. service方法
    // 每次访问Servlet程序都会调用
4. destroy方法
    // 在web工程停止的时候调用
实现Servlet类下如何获取GET&POST方法
1. 若在service方法中
	// 使用servletRequest的子类型HttpServletRequest中的getMethods方法来获取到底是get请求还是post请求
    HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
    String method = httpServletRequest.getMethod();
    System.out.println(method);
    if ("GET".equals(method)) {
    	System.out.println("get方法");
    } else {
    	System.out.println("post方法");
 	}
如何通过"继承HttpServlet类"来创建一个servlet程序(通过一个类继承HttpServlet类)
1. 编写一个类去继承 HttpServlet2. 根据业务需求来重写doGet或者doPost方法
    public class TestHttpServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            super.doGet(req, resp);
        }

        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            super.doPost(req, resp);
        }
	}
3. 到web.xml中去配置Servlet访问地址    
    // 同上配置
解决右键New未出现Servlet配置项(变相就是通过Idea来创建Servlet程序)
https://blog.csdn.net/a124654564/article/details/119105837?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-0.pc_relevant_paycolumn_v3&spm=1001.2101.3001.4242.1&utm_relevant_index=3
整个Servlet继承实现体系

JavaWeb(Tomcat&Servlet)_第3张图片

ServletConfig类
1. 用处
    Servlet程序的配置信息类;
    Servlet程序和ServletConfig对象都是由Tomcat负责创建,我们负责使用;
    Servlet程序默认是第一次访问的时候创建,ServletConfig是每个Servlet程序创建时,就创建一个对应的ServletConfig对象。
    
2. 三大作用(均在init方法中使用)
    2.1 "获取Servlet程序的别名(web.xml中的servlet-name)"
     // servletConfig.getServletName()
    
    2.2 "获取初始化参数init-param(web.xml中找到当前Servlet配置标签项)"
     // 
     <Servlet>
     	// Servlet配置
    	// ...
    	// servletConfig init参数
    	<init-param>
    		<param-name>username</param-name>
    		<param-value>root</param-value>
    	</init-param>
     </Servlet>
     // servletConfig.getInitParameter("username")
    
   2.3 "获取ServletContext对象"
    // servletConfig.getServletContext()
ServletContext类
1. 含义
    ServletContext是一个接口,表示Servlet上下文对象;
    一个web工程,只有一个ServletContext对象实例;
    ServletContext对象是一个域对象。
    
    什么是域对象?
    	是可以像Map一样存取数据的对象,叫域对象。
    	这里的域指的是存取数据的操作范围。(整个web工程)
    
2. 四个作用
    2.1 "获取web.xml中配置的上下文参数(与标签同级)"
    	// web.xml
    		<!--    配置servletContext配置项 -->
                <context-param>
                    <param-name>sameLevelServlet</param-name>
                    <param-value>1234</param-value>
                </context-param>
        // servlet 的doPost方法中
    		ServletContext servletContext = getServletContext(); // 这里我直接使用getServletContext()方法 该方法在GenericServlet抽象类当中
        	System.out.println("获取配置的context域对象参数sameLevelServlet的值" + servletContext.getInitParameter("sameLevelServlet")); // 特别需要注意获取context-param参数也使用getInitParameter方法 但注意不能得到init-param配置项
    
    2.2 "获取当前的工程路径,格式:/工程路径"
        System.out.println("获取当前的工程路径,格式: /工程路径:" + servletContext.getContextPath()); // 若在本地则同Tomcat中Deployment中的Application context设置相同,也等于url路径中端口号后面到Servlet名称前内容
    
    2.3 "获取工程部署后在服务器硬盘上的绝对路径"
        System.out.println("获取工程部署到服务器硬盘上的绝对路径" + servletContext.getRealPath("/"));
	    //	"/":斜杠表示被服务器解析地址为:http://ip:port/工程名/
        //   再者映射到IDEA代码目录中的web文件夹
    
    2.4 "像Map一样存取数据"
        ServletContext servletContext = getServletContext();
	    servletContext.setAttribute(key,value)
        servletContext.getAttribute(key)
        servletContext.removeAttribute(key)
    
    2.5 "ServletContext是在web工程部署启动的时候创建,在web工程停止的时候销毁"        
GET请求分析

JavaWeb(Tomcat&Servlet)_第4张图片

POST请求分析

JavaWeb(Tomcat&Servlet)_第5张图片

HTTP-Request-Header

JavaWeb(Tomcat&Servlet)_第6张图片

HTTP-Response-Header

JavaWeb(Tomcat&Servlet)_第7张图片

2022.04.29

HttpServletRequest类
1. 作用
    每次只要有请求进入 Tomcat 服务器,Tomcat 服务器就会把请求过来的 HTTP 协议信息解析好封装到 Request 对象中。然后传递到 service 方法(doGet 和 doPost)中给我们使用。我们可以通过 HttpServletRequest 对象,获取到所有请求的信息。
    
2. 常用方法
    // -----------------------------setCharacterEncoding--------------------------
    3.1 setCharacterEncoding() - "设置字符集" (针对post请求 中文乱码 但是必须要在请求参数之前 调用)
        req.setCharacterEncoding("UTF-8")
    
    // ------------------------------------base-----------------------------------
    2.1 getRequestURI() - "获取请求的资源路径"
    System.out.println("getRequestURI() - \"获取请求的资源路径\"" + req.getRequestURI());
	// /servlet-demo/TestHttpServletRequest

    2.2 getRequestURL() - "获取请求的统一资源定位符(绝对路径)"
    System.out.println("getRequestURL() - \"获取请求的统一资源定位符(绝对路径)\"" + req.getRequestURL());    
    // http://127.0.0.1:8080/servlet-demo/TestHttpServletRequest

    2.3 getRemoteHost() - "获取客户端的IP"
    System.out.println("getRemoteHost() - \"获取客户端的IP\"" + req.getRemoteHost());
	// 127.0.0.1

    2.4 getHeader() - "获取请求头"
    System.out.println("getHeader() - \"获取请求头\"" + req.getHeader("content-type"));
	// application/x-www-form-urlencoded
	
	2.7 getMethod() - "获取请求的方式"
    System.out.println("getMethod() - \"获取请求的方式\"" + req.getMethod());
	// POST
	
	// --------------------------------获取参数值-----------------------------------
    2.5 getParameter() - "获取请求的参数"
    	String username = req.getParameter("username");
        String password = req.getParameter("password");
        System.out.println("username: " + username);
        System.out.println("password: " + password);    

    2.6 getParameterValues() - "获取请求的参数(多个值(当存在一个字段key 跟多个value值时)时使用)"
        String[] hobbies = req.getParameterValues("hobby");
        System.out.println("hobby: " + Arrays.asList(hobbies));
        
    
	// ------------------------------设置获取数据域---------------------------------
    2.8 setAttribute(key,value) - "设置数据域"
        req.setAttribute("fromHttpServletRequest", "test");

    2.9 getAttribute(key) - "获取数据域"
        Object fromHttpServletRequest = req.getAttribute("fromHttpServletRequest");
        System.out.println(fromHttpServletRequest);
	
    // --------------------------------请求转发-------------------------------------
    3.0 getRequestDispatcher() - "获取请求转发对象"
        RequestDispatcher requestDispatcher = req.getRequestDispatcher("/TestDispatcher"); // "/"表示http://ip:port/工程名(映射到idea中的web文件夹)
        requestDispatcher.forward(req, resp);
	
	// -------------------------------请求转发特点----------------------------------
	    1. 浏览器地址栏没有变化
     	2. 他们是一次请求
         3. 他们共享Request域中的数据
         4. 可以转发到WEB-INF目录下的资源
         5. 不可以访问工程以外的资源
请求转发示意图

JavaWeb(Tomcat&Servlet)_第8张图片

JavaWeb中的相对路径和绝对路径
相对路径:
	.   // 表示当前目录
    ..  // 表示上一级目录
    资源名 // 表示当前目录/资源名
    
绝对路径:
    http://ip:port/工程路径/资源路径
web中 / 斜杠的不同意义
在web中 / 斜杠 是一种绝对路径
    
/ 斜杠:如果被"浏览器"解析,得到的地址是:"http://ip:port"
    如:<a href="/">斜杠</a>
    
/ 斜杠:如果被"服务器"解析,得到的地址是:"http:ip:port/工程路径"    
    如:<url-pattern>/servlet</url-pattern>
        servletContext.getRealPath("/")
        request.getRequestDispatcher("/")

特殊情况:respose.sendRedirect("/") 把斜杠发送给浏览器解析,得到"http://ip:port/"    

2022.04.30

HttpServletResponse类
HttpServletResponse 类和 HttpServletRequest 类一样。每次请求进来,Tomcat 服务器都会创建一个 Response 对象传递给 Servlet 程序去使用。HttpServletRequest 表示请求过来的信息,HttpServletResponse 表示所有响应的信息,我们如果需要设置返回给客户端的信息,都可以通过 HttpServletResponse 对象来进行设置
响应的两个输出流的说明
字节流:getOutputStream() 常用于下载(传递二进制数据)
字符流:getWriter() 常用于回传字符串(常用)
两个流同时只能使用一个,否则报错。    
如何解决客户端响应、服务端打印中文乱码问题
1. 首先Tomcat默认的字符集是 ISO-8859-1
    // 通过resp.getCharacterEncoding()来查看
2. 手动设置服务器的字符集
    // 通过resp.setCharacterEncoding("UTF-8")
    // 这步设置过后可以看到服务器打印出来的字体是正确的中文,但是响应给浏览器的还是乱码,因此需要服务器告诉浏览器以什么字符集来显示,这里就体现了响应头中的Content-Type
3. 通知浏览器客户端以什么字符集显示
    // resp.setHeader("Content-Type","text/html;charset=UTF-8")
    // PrintWriter writer = resp.getWriter()
    // writer.write("这是我的响应!!!")

4. 一步到位设置
    // resp.setContentType("text/html;charset=UTF-8")
    // 同时设置客户端、服务端使用UTF-8字符集且设置响应头
请求重定向
// 方式1
resp.setStatus(302)
resp.setHeader("Location","http://localhost:8080/servlet-web/testResponse2")
    
// 方式2
resp.sendRedirect("http://localhost:8080/servlet-web/testResponse2")

JavaWeb(Tomcat&Servlet)_第9张图片

e(“text/html;charset=UTF-8”)
// 同时设置客户端、服务端使用UTF-8字符集且设置响应头


#### 请求重定向

```java
// 方式1
resp.setStatus(302)
resp.setHeader("Location","http://localhost:8080/servlet-web/testResponse2")
    
// 方式2
resp.sendRedirect("http://localhost:8080/servlet-web/testResponse2")

JavaWeb(Tomcat&Servlet)_第10张图片
SGGJavaWeb

你可能感兴趣的:(Java,java,tomcat,servlet)