zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    HDU 5918 SequenceI (2016 CCPC长春站 KMP模版变形)
    HDU 4585 Shaolin (set的应用)
    HDU 4329 MAP(stringstream的用法)
    CodeForces 698B Fix a Tree (并查集应用)
    UVALive 2520 Holedox Moving(BFS+状态压缩)
    UVA
    毛竹
    kmp
    博弈论
    最长回文子串
  • 原文地址:https://www.cnblogs.com/meloncodezhang/p/12984795.html
Copyright © 2011-2022 走看看