tomcat部署项目一:servlet

浏览器无法直接访问src里面的东西,需要进行间接的配置进行访问。

一:web.xml的映射方式

浏览器访问:http://localhost:8080/test/demo没有反应,但是控制台输出

为什么url是http://localhost:8080/test/demo,而不是http://localhost:8080/demo呢?

因为当时自己配置的url的初始路径是方框标记出来的。

也就是当你访问初始url的时候,会访问index.jsp里面的文件。

MyServlet

package com.qianle.servlet;

import javax.servlet.*;
import java.io.IOException;

public class MyServlet implements Servlet {
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("haha");
    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("servlet is running");
        servletResponse.getWriter().write("hello client"); # 给浏览器返回的字符串信息
    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {

    }
}

访问:http://localhost:8080/test/demo

返回中文浏览器乱码问题,返回之前设置文本类型和编码

@Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("servlet is running");
        servletResponse.setContentType("text/html;charset=utf-8");
        servletResponse.getWriter().write("你好中国");
    }

获取查询字符串

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        // 获取查询字符串        
        String id = servletRequest.getParameter("id");
        servletResponse.setContentType("text/html;charset=utf-8");
        servletResponse.getWriter().write(id);
    }

访问:http://localhost:8080/test/demo?id=你好中国

二:注解的方式

清空web.xml里面的servlet文件和servlet-mapping

@WebServlet(urlPatterns = "/demo")
public class MyServlet implements Servlet {

三:servlet的生命周期

package com.qianle.servlet;

import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;


@WebServlet(urlPatterns = "/demo")
public class MyServlet implements Servlet {
    @Override  # 1.先初始化方法
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("进入init方法里面");;
    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    @Override  # 2.调用方法
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("进入service方法里面");
    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override # 3.停止运行后调用
    public void destroy() {
        System.out.println("进入destroy方法里面");
    }
}

访问 http://localhost:8080/test/demo 后控制台输出

连续访问http://localhost:8080/test/demo

init方法只在第一次访问的时候调用,其他的请求只调用service方法,只创建了一个servlet对象,类似于单例模式,节省内存开销

停止运行后

理解一下反射机制

Java的反射(reflection)机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。这种动态获取程序信息以及动态调用对象的功能称为Java语言的反射机制。反射被视为动态语言的关键

MyServlet.class

package com.qianle.servlet;

import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;


@WebServlet(urlPatterns = "/demo")
public class MyServlet implements Servlet {

    public MyServlet(){
        System.out.println("无参数构造MyServlet对象");
    }

    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("init");;
    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("service");
    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {
        System.out.println("destroy");
    }
}

Tomcat_test.java

package com.qianle.servlet;

import java.lang.reflect.Constructor;

public class Tomcat_test {
    public static void main(String[] args) {
        String str = "com.qianle.servlet.MyServlet";  # 定义路径字符串
        try {
            Class obj = Class.forName(str);  # 通过字符串找到类名
            Constructor method1 = obj.getConstructor();  # 通过类名调用构造方法
            Object instance = method1.newInstance();  # 通过构造方法的来创建对象
            System.out.println(instance);
        }catch (Exception e){
            e.printStackTrace();
        }

    }
}

运行后

了解初始化方法

getServletName()

@Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("init");
        # com.qianle.servlet.MyServlet  全类型,就是带着包名的类名
        System.out.println(servletConfig.getServletName());

    }
    

注意:getInitParameter(参数名),读取的是配置文件里面的参数,也就是web.xml里面的参数,因此不能使用注解的形式访问

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

         <servlet>
             <servlet-name>haha</servlet-name>
             <servlet-class>com.qianle.servlet.MyServlet</servlet-class>
             <init-param>  # 初始化参数
                 <param-name>name</param-name>  # 参数名
                 <param-value>kobe</param-value> # 参数值
             </init-param>
         </servlet>

        <servlet-mapping>
            <servlet-name>haha</servlet-name>
            <url-pattern>/demo3</url-pattern>
        </servlet-mapping>

</web-app>

    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println(servletConfig.getInitParameter("name"));
    }

方法的返回值是一个集合类型,可以通过迭代进行获取,

修改web.xml,增加参数

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

         <servlet>
             <servlet-name>haha</servlet-name>
             <servlet-class>com.qianle.servlet.MyServlet</servlet-class>
             <init-param>
                 <param-name>name</param-name>
                 <param-value>kobe</param-value>
             </init-param>

             <init-param>
                 <param-name>password</param-name>
                 <param-value>lakers</param-value>
             </init-param>
         </servlet>

        <servlet-mapping>
            <servlet-name>haha</servlet-name>
            <url-pattern>/demo3</url-pattern>
        </servlet-mapping>

</web-app>

# 迭代

 @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        Enumeration<String> enumeration = servletConfig.getInitParameterNames();
        while (enumeration.hasMoreElements()){
            System.out.println(enumeration.nextElement());
        }

    }

返回的对象是一个类似于集合容器,所有输出的数据无序

# TODO

原文地址:https://www.cnblogs.com/meloncodezhang/p/12984795.html