【JavaWeb学习笔记】 9 - Servlet的相关类--ServletConfig、ServletContext、HttpServletRequest

ServletConfig

一、ServletConfig

1.ServletConfig介绍

1. ServletConfig类是为Servlet程序的配置信息的类

2. Servlet程序和ServletConfig对象都是由Tomcat负责创建

3. Servlet程序默认是第1次访问的时候创建,ServletConfig在Servlet程序创建时,就创建一个对应的ServletConfig对象

2.ServletConfig类能干什么

1.获取Servlet程序的servlet-name的值

2.获取初始化参数init-param

3.获取ServletContext对象

3.应用实例

DBServlet

public class DBServlet extends HttpServlet {
    /**
     * 梳理ServletConfig config 使用流程
     * 1. 当DBServlet对象初始化时, tomcat会同时创建一个 ServletConfig对象
     * 2. 这时如果DBServlet init() 方法中你调用 super.init(config);
     * 3. 调用 父类 GenericServlet
     * public void init(ServletConfig config) throws ServletException {
     * this.config = config;
     * this.init();
     * }
     * 这时就会把 Tomcat创建的 ServletConfig对象赋给 GenericServlet的属性 config
     * 4. 因此如果你重写init()方法,记住如果你想在其它方法通过 getServletConfig() 方法获取ServletConfig
     * , 则一定要记住 调用  super.init(config);
     * @param config
     * @throws ServletException
     */

    @Override
    public void init(ServletConfig config) throws ServletException {
        //ConcurrentHashMap, 是一个线程安全的容器.
        System.out.println("init" + config);
        super.init(config);
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //在DBServlet 执行 doGet()/doPost() 时,可以获取到web.xml配置的用户名和密码
        //你是一个OOP程序员->现有的方法或对象来搞定
        //DBServlet的父类GenericServlet有getServletConfig()
        /**
         * 1. getServletConfig() 方法是 GenericServlet
         * 2. 返回的 servletConfig对象是 GenericServlet private transient ServletConfig config;
         * 3. 当一个属性被 transient 修饰,表示该属性不会被串行化(有些重要信息,不希望保存到文件)
         */
        ServletConfig servletConfig = getServletConfig();
        System.out.println("doPost=" + servletConfig);
        String username = servletConfig.getInitParameter("username");
        String pwd = servletConfig.getInitParameter("pwd");
        System.out.println("初始化参数username= " + username);
        System.out.println("初始化参数pwd= " + pwd);

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}

配置DBServletConfig

 <!--配置DBServlet-->
    <servlet>
        <servlet-name>DBServlet</servlet-name>
        <servlet-class>com.yinhai.servlet.DBServlet</servlet-class>
        <!--配置信息,而不是硬编码到程序-->
        <init-param>
            <param-name>username</param-name>
            <param-value>yinhai</param-value>
        </init-param>
        <init-param>
            <param-name>pwd</param-name>
            <param-value>123456</param-value>
        </init-param>
    </servlet>

    <servlet-mapping>
        <servlet-name>DBServlet</servlet-name>
        <url-pattern>/db</url-pattern>
    </servlet-mapping>

ServletContext

二、ServletContext

1.为什么需要ServletContext

如果需要统计多个Servlet被调用的次数

可以使用DB数据库

或者ServletContext类 

2.基本介绍

1. ServletContext是一个接口, 它表示Servlet上下文对象

2.一个web工程,只有一 一个ServletContext对象实例

3. ServletContext对象是在web工程启动的时候创建,在web工程停止的时销毁

4. ServletContext对象可以通过 ServletConfig.getServletContext() 方法获得对ServletContext对象的引用,也可以通过this.getServletContext()来获得其对象的引用。

5.由于一个WEB应用中的所有Servlet共享同一个ServletContext对象,因此Servlet对 象之间可以通过ServletContext对象来实现多个Servlet间通讯。ServletContext对 象通常也被称之为域对象。[ 示意图]

3.ServletContext可以做什么

1.获取web.xml中配置的上下文参数context-param [信息和整个web应用相关,而不是属于某个Servlet]

2.获取当前的工程路径,格式: /工程路径

3.获取工程部署后在服务器硬盘上的绝对路径

4.像Map一样存取数据,多个Servlet共享数据

4.案例1

需求如下:

1.获取web.xml中配置的上下文参数context-param

2.获取当前的工程路径,格式: /工程路径

3.获取工程部署后在服务器硬盘上的绝对路径

配置站点信息

    <!--配置整个网站的信息-->
    <context-param>
        <param-name>website</param-name>
        <param-value>http://www.yinhai.net</param-value>
    </context-param>
    <context-param>
        <param-name>company</param-name>
        <param-value>yinhai</param-value>
    </context-param>
public class ServletContext_ extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取web.xml的context-parameter

        //1.获取到ServletContext对象
        ServletContext servletContext = getServletContext();
        //2. 获取website
        String website = servletContext.getInitParameter("website");
        String company = servletContext.getInitParameter("company");
        //3. 获取项目的工程路径
        String contextPath = servletContext.getContextPath();
        //4. 获取项目发布会,正在的工作路径
        String realPath = servletContext.getRealPath("/");
        System.out.println("项目路径= " + contextPath);// /servlet
        System.out.println("website= " + website);
        System.out.println("company= " + company);
        System.out.println("项目发布后的绝对路径= " + realPath);

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}

工程路径 out目录 

5.案例2

完成简单的网站访问计数器

2.使用Chrome访问Servlet01,每访问一次, 就增加1访问次数,在后台输出,并将结果返回给浏览器显示

3.使用火狐访问Servlet02,每访问一次, 就增加1访问次数,在后台输出,并将结果返回给浏览器显示

public class OrderServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取ServletContext对象
        ServletContext servletContext = getServletContext();
        System.out.println("OrderServletContext=" + servletContext
                + "运行类型" +servletContext.getClass());
        //从servletContext获取visit_count属性k-v
        Object visit_count = servletContext.getAttribute("visit_count");//设置一个名叫visit_count的k值
        if(visit_count == null){
            //说明是第一次访问网站
            servletContext.setAttribute("visit_count" , 1);
            visit_count = 1;
        }else{
           //说明是第二次以后
           visit_count = Integer.parseInt(visit_count + "") + 1;
           servletContext.setAttribute("visit_count" , visit_count);
        }
        //输出显示
        response.setContentType("text/html;charset=utf-8");
        PrintWriter writer = response.getWriter();
        writer.print("<h1>该网站被访问的次数是 "+ visit_count + "</h1>");
        writer.flush();
        writer.close();
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request,response);
    }
}
public class PayServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取ServletContext对象
        ServletContext servletContext = getServletContext();
        System.out.println("OrderServletContext=" + servletContext
                + "运行类型" +servletContext.getClass());
        //从servletContext获取visit_count属性k-v
        Object visit_count = servletContext.getAttribute("visit_count");
        if(visit_count == null){
            //说明是第一次访问网站
            servletContext.setAttribute("visit_count" , 1);
            visit_count = 1;
        }else{
            //说明是第二次以后
            visit_count = Integer.parseInt(visit_count + "") + 1;
            servletContext.setAttribute("visit_count" , visit_count);
        }
        //输出显示
        response.setContentType("text/html;charset=utf-8");
        PrintWriter writer = response.getWriter();
        writer.print("<h1>该网站被访问的次数是 "+ visit_count + "</h1>");
        writer.flush();
        writer.close();
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request,response);
    }
}

HttpServletResquest

 三、HttpServletRequest

1.HttpServletRequest介绍

1. HttpServletRequest对象代表客户端的请求

2.当客户端/浏览器通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中

3.通过这个对象的方法,可以获得客户这些信息。

2.HttpServletRequest类图

3.HttpServletRequest常用方法

4.实例

1.需求:说明:在一个表单提交数据给Servlet ,然后在Servlet通过HttpServletRequest对象获取相关数据

public class HttpServletRequestMethods extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //这里我们使用request对象,获取表单提交的各种数据
        System.out.println("HttpServletRequestMethods doPost() 被调用..");

        /***********************************
         *  获取和http请求头相关信息
         ***********************************/

        System.out.println("请求的资源路径URI= " + request.getRequestURI());
        //http://主机/uri
        System.out.println("请求的统一资源定位符(绝对路径)URL= " + request.getRequestURL());
        System.out.println("请求的客户端ip 地址= " + request.getRemoteAddr());//本地就是127.0.01
        //思考题:如发现某个ip 在10s中,访问的次数超过 100次,就封ip
        //实现思路: 1用一个集合concurrentHashmap[ip:访问次数] 2[线程/定时扫描] 3 做成处理
        // 获取http请求头的信息,可以指定其他,比如 User-Agent , Host等待 老师就举一个例子
        System.out.println("http请求头HOST= " + request.getHeader("Host"));
        // 说明,如果我们希望得到请求的头的相关信息,可以使用request.getHeader("请求头字段")
        System.out.println("该请求的发起地址是= " + request.getHeader("Referer"));
        // 请获取访问网站的浏览器是什么?
        String userAgent = request.getHeader("User-Agent");
        System.out.println("User-Agent= " + userAgent);
        // 取出FireFox, 取出最后
        String[] s = userAgent.split(" ");
        System.out.println("浏览器=" + s[s.length - 1].split("\\/")[0]);
        //获取 Cookie
        // 	JSESSIONID=8CBBD23BDE01BAE6705E03C5C8916BD1

        String cookie = request.getHeader("Cookie");
        String JSESSIONID = cookie.split("=")[1];
        System.out.println("取出JSESSIONID= " + JSESSIONID);

        //课堂练习: 要求同学们取出  Windows NT 10.0  和 Win64
        // 主要是Get / Post
        System.out.println("http请求方式~= " + request.getMethod());
        /***********************************
         *  获取和请求参数相关信息, 注意要求在返回数据前,获取参数
         ***********************************/

        //解决接收参数的中文乱码问题, 老师提示,写在 getParameter前.
        request.setCharacterEncoding("utf-8");
        //1. 获取表单的数据[单个数据]
        //username=tom&pwd=&hobby=hsp&hobby=spls
        String username = request.getParameter("username");
        String pwd = request.getParameter("pwd");


        //2. 获取表单一组数据
        String[] hobbies = request.getParameterValues("hobby");
        System.out.println("username= " + username);
        System.out.println("pwd= " + pwd);
        //增强for循环的快捷键 iter->回车即可 , 能使用快捷键,就使用快捷键
        for (String hobby : hobbies) {
            System.out.println("hobby=" + hobby);
        }

        //推而广之, 如果是 单选 , 下拉框 等等. => 作业布置

        //返回接收到的信息, 给浏览器回显
        //本质就是在http响应头,加上 Content-Type: text/html;charset=utf-8
        //说 text/html 表示返回的数据类型,浏览器会根据这个类型来解析数据
        // text/plain 表示返回的数据,请浏览器使用文本方式解析
        // application/x-tar 表示返回的是文件,浏览器就会以下载文件的方式处理
        response.setContentType("text/html;charset=utf-8");
        PrintWriter writer = response.getWriter();
        writer.print("<h1>提交的用户名= " + username + "</h1>");
        writer.flush();
        writer.close();

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}

5.细节和注意事项

1.获取doPost參数中文乱码解决方案,注意setCharacterEncoding("utf-8")要写在request.getParameter()前。

2.注意:如果通过PrintWriter writer,有返回数据给浏览器,建议将获取参数代码写在writer.print()之前,否则可能参数值(doPost)

3.处理http响应数据中文乱码问题

4.再次理解Http协议响应Content-Type的含义,比如text/plain         application/x-tar

6.课堂作业

获取Cookie

//获取 Cookie
        // 	JSESSIONID=8CBBD23BDE01BAE6705E03C5C8916BD1

        String cookie = request.getHeader("Cookie");
        String JSESSIONID = cookie.split("=")[1];
        System.out.println("取出JSESSIONID= " + JSESSIONID);

四、HttpServletRequest请求转发

1.为什么需要请求转发

一个业务需要多个servlet帮助

2.什么是请求转发

1.实现请求转发:请求转发指一-个web资源收到客户端请求后,通知服务器去调用另外- - 个web资源进行处理

2. HttpServletRequest对象(也叫Request对象)提供了一个getRequestDispatcher方法,该方法返回-一个RequestDispatcher对象,调用这个对象的forward方法可以实现请求转发

3. request对象同时也是一个域对象, 开发人员通过request对象在实现转发时,把数据通request对象带给其它web资源处理

●setAttribute方法

●getAttribute方法

●removeAttribute方法

●getAttributeNames方法

3.实现请求转发

红线代表 Servlet01完之后告诉Tomcat还有Servlet02

4.应用案例

创建两个类,一个用于检查用户 一个用于提供用户的操作

创建一个CheckServlet类 然后该类结束告诉Tomcat需要进行另外的Servlet调用

@WebServlet(name = "CheckServlet",urlPatterns = "/checkServlet")
public class CheckServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("checkServlet be invoked...");
        //根据用户名来确定该用户是什么身份
        String username = request.getParameter("username");
        //注意:如果是同一个request对象(请求转发),那么可以在不同的servlet中,使用getParameter
        if ("tom".equals(username)) {
            //分配
            request.setAttribute("role", "管理员");
        } else {
            request.setAttribute("role", "普通用户");
        }

        //获取分发器
        //        1. /manageServlet写的是 要转发的servlet的url
        //        2. 会被解析成/servlet/manageServlet
        //        3. forward(request, response) 表示把当前servlet的request对象和response对象,传递给下一个servlet使用

        RequestDispatcher requestDispatcher =
                request.getRequestDispatcher("/manageServlet");

        requestDispatcher.forward(request, response);


    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request,response);
    }
}

 ManageServlet类

@WebServlet(name = "Servlet" , urlPatterns = "/manageServlet")
public class ManageServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("manageServlet be invoked...");

        String username = request.getParameter("username");
        String role = (String) request.getAttribute("role");

    //输出信息
        response.setContentType("text/html;charset=utf-8");
        PrintWriter writer = response.getWriter();
        writer.print("用户名: " + username + "<br/>");
        writer.print("角色 : " + role);
        writer.flush();
        writer.close();
}

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request,response);
    }
}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登录</title>
</head>
<body>
<form action="http://localhost:8080/servlet/checkServlet" method="post">
    u: <input type="text" name="username"><br>
    <input type="submit" value="登录">
</form>
</body>
</html>

5.请求转发注意事项和细节

1.浏览器地址不会变化(地址会保留在第1个servlet的urI)

2.在同一次HTTP请求中心进行多次转发,仍然是-次HTTP请求

3.在同一次HTTP请求中, 进行多次转发,多个Servlet可以共享request域/对象的数据,因为始终是同一个request对象

4.可以转发到WEB-INF目录下

5.不能访问当前WEB工程外的资源(错误的)

6.因为浏览器地址栏会停止在第一个servlet ,如果你刷新页面,会再次发出请求(并且会带数据),所以在支付页面情况下,不要使用请求转发,否则会造成重复支付

五、HttpServletRequest课后作业

1)编写一个RegisterServlet ,能够接收到提交的各种数据

2)并把接收到的数据返回给浏览器,并显示

3)注意处理中文乱码问题

4)暂不处理文件提交

5)获取操作系统

POST /homeworkServlet HTTP/1.1


Host: localhost:8080
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:120.0) Gecko/20100101 Firefox/120.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate, br
Content-Type: application/x-www-form-urlencoded
Content-Length: 68
Origin: http://localhost:8080
Connection: keep-alive
Referer: http://localhost:8080/servlet/homework01.html
Cookie: Idea-b98d27c7=9e6cf02b-2f2a-49f6-bd74-84801e7b197b
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: same-origin
Sec-Fetch-User: ?1
Pragma: no-cache
Cache-Control: no-cache

 username=1&pwd1=&pwd2=&sport=zq&sport=sq&gender=male&city=cd&myfile=

 

@WebServlet(name = "Homework01",urlPatterns = "/homeworkServlet")
public class HomeworkServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("homeworkServlet be invoked...");
        /***********************************
         *  获取和请求参数相关信息, 注意要求在返回数据前,获取参数
         ***********************************/

        //解决接收参数的中文乱码问题,写在 getParameter前.
        request.setCharacterEncoding("utf-8");
        //1. 获取表单的数据[单个数据]
        //username=1&pwd1=&pwd2=&sport=zq&sport=sq&gender=male&city=cd&myfile=
        String username = request.getParameter("username");
        String pwd1 = request.getParameter("pwd1");
        String pwd2 = request.getParameter("pwd2");
        String gender = request.getParameter("gender");
        String city = request.getParameter("city");
        String myfile = request.getParameter("myfile");
        //2. 获取表单一组数据
        System.out.println("username= " + username);
        System.out.println("pwd1= " + pwd1);
        System.out.println("pwd2= " + pwd2);
        System.out.println("gender= " + gender);
        System.out.println("city= " + city);
        //增强for循环的快捷键 iter->回车即可
        String[] sport = request.getParameterValues("sport");
        System.out.print("sport = ");
        for (String s : sport) {
            System.out.print(s);
        }
        System.out.println();
        //获取电脑操作系统
        String header = request.getHeader("User-Agent");
        String regStr = "\\((.+)\\)";//分组
        Pattern pattern = Pattern.compile(regStr);
        Matcher matcher = pattern.matcher(header);
        matcher.find();
        String group = matcher.group(1);
        String[] split = group.split(";");
        String system = split[0];
        String bit = split[1];


        //返回接收到的信息, 给浏览器回显
        //本质就是在http响应头,加上 Content-Type: text/html;charset=utf-8
        //说 text/html 表示返回的数据类型,浏览器会根据这个类型来解析数据
        // text/plain 表示返回的数据,请浏览器使用文本方式解析
        // application/x-tar 表示返回的是文件,浏览器就会以下载文件的方式处理
        response.setContentType("text/html;charset=utf-8");
        PrintWriter writer = response.getWriter();
        writer.print("<h1>提交的用户名= " + username + "</h1>");
        writer.print("<h1>操作系统= " + system + "</h1>");
        writer.print("<h1>操作系统= " + bit + "</h1>");
        writer.flush();
        writer.close();

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request,response);
    }
}

 

HttpServletResponse

六、HttpServletResponse基本介绍

1.HttpServletResponse介绍

1.每次HTTP请求,Tomcat会创建一个HttpServletResponse对象传递给Servlet程序去使用。

2. HttpServletRequest表示请求过来的信息,HttpServletResponse 表示所有响应的信息,如果需 要设置返回给客户端的信息,通过HttpServletResponse 对象来进行设置即可

2.HttpServletResponse类图

3.向客户端返回数据方法

1.字节流getOutputStream();常用于下载(处理二进制数据)

2.字符流getWriter();常用于回传字符串

3.两个流同时只能使用一个。使用了字节流,就不能再使用字符流,反之亦然,否则就会报错

4.向客户端返回数据应用实例

5.向客户端返回数据注意事项和细节

七、HttpServletResponse请求重定向

1.示意图

2.应用案例

DownServlet用于处理用户的下载请求

@WebServlet(name = "DownServlet",urlPatterns = "/downServlet")
public class DownServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        // System.out.println("DownServlet 被调用");
        // response.setContentType("application/x-tar;charset=utf-8");
        // PrintWriter writer = response.getWriter();
        // writer.print("hi");
        // writer.flush();
        // writer.close();

        //完成了自己业务
        //发出请求重定向-> DownServletNew
        //1. sendRedirect 本质就会 返回 302 状态码 Location: /servlet/downServletNew
        //2. 因此 302和 /servlet/downServletNew 是浏览器解析,而不是服务器
        //3. 浏览器在解析 /servlet/downServletNew => http://localhost:8080/servlet/downServletNew
        //4. 动态获取到application context
        String contextPath = getServletContext().getContextPath();
        System.out.println("contextPath= " + contextPath);
        //response.sendRedirect("/servlet/downServletNew");
        response.sendRedirect(contextPath + "/downServletNew");
        //response.sendRedirect("http://www.baidu.com");

        //第二种重定向的写法
        // System.out.println("第二种方式重定向...");
        // response.setStatus(302); //设置http响应的状态码
        // //设置http响应的 Location: /servlet/downServletNew
        // response.setHeader("Location", "/servlet/downServletNew");


    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request,response);
    }
}

请求重定向到DownServletNew上 

@WebServlet(name = "DownServletNew",urlPatterns = "/downServletNew")
public class DownServletNew extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        System.out.println("DownServletNew 被调用");
        response.setContentType("text/html;charset=utf-8");
        PrintWriter writer = response.getWriter();
        writer.print("ok");
        writer.flush();
        writer.close();
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request,response);
    }
}

3.注意事项

1.最佳应用场景:网站迁移,比如原域名是www.hsp.com迁移到www.hsp.cn,但是百度抓取的还是员网址.

2.浏览器地址会发生变化,本质是两次http请求.

3.不能共享Request域中的数据,本质是两次http请求,会生成两个HttpServletRequest对象

4.不能重定向到/WEB-INF下的资源

5.可以重定向到Web工程以外的资源,比如到www.baidu.com [在前面的案例演示 ]

6.重定向有两种方式,推荐使用第1种.

//第二种重定向的写法
        // System.out.println("第二种方式重定向...");
        // response.setStatus(302); //设置http响应的状态码
        // //设置http响应的 Location: rvlet/downServletNew
        // response.setHeader("Location", "rvlet/downServletNew");

7.动态获取到application context

//动态获取到application context
        String contextPath = getServletContext().getContextPath();
        System.out.println("contextPath= " + contextPath);
        response.sendRedirect(contextPath + "/downServletNew"); 

 八、HttpServletResponse课后作业

模拟支付

@WebServlet(name = "MyPayServlet",urlPatterns = "/myPayServlet")
public class MyPayServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //System.out.println("MyPayServlet 被调用...");
        //得到金额
        String money = request.getParameter("money");
        System.out.println("money= " + money.getClass());
        //转成int
        //处理一下这个异常
        int iMoney = WebUtils.parseString(money);
        ServletContext servletContext = getServletContext();
        if(iMoney > 100) {
            //重定向到payok.html
            //servletContext.getContextPath() 就是 /servlet
            response.sendRedirect(servletContext.getContextPath() + "/payok.html");
        } else {
            response.sendRedirect(servletContext.getContextPath() + "/pay.html");
        }
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}

一个判断是否输入为数字的类

public class WebUtils {

    public static int parseString(String str) {
        int num = 0;
        try {
            num = Integer.parseInt(str);//
        } catch (NumberFormatException e) {
            //这个异常不会throw 给 tomcat
            System.out.println("输入的str格式不正确...");
        }

        return num;
    }
}

支付页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>支付页面</title>
</head>
<body>
<h1>支付页面</h1>
<!--注意:这里action="/servlet/myPayServlet"的第一/被浏览器解析从浏览器地址栏的主机-->
<form action="/servlet/myPayServlet" method="post">
    用户编号: <input type="text" name="userid"><br/>
    支付金额: <input type="text" name="money"><br/>
    <input type="submit" value="点击支付">
</form>
</body>
</html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/239903.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

GEE:重分类

作者:CSDN @ _养乐多_ 本文记录了在 Google Earth Engine(GEE)平台上对一副类别图像进行重分类的代码。并以 COPERNICUS/Landcover/100m/Proba-V-C3/Global 数据集中的土地利用数据为例。 结果如下图所示, 文章目录 一、核心函数二、示例代码三、代码链接一、核心函数 核…

vue-如何实现带参数跳转页面

文/朱季谦 在vue框架的前端页面上&#xff0c;若要实现页面之间的带参数跳转&#xff0c;可参考以下实现过程&#xff1a; 例如&#xff0c;点击截图中的“查看试卷”&#xff0c;可实现带参跳转到相应的试卷页面&#xff0c;该功能类似查看试卷的详情页面&#xff1a; 假如以…

mfc110u.dll丢失的解决方法,mfc110u.dll丢失原因是什么?

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“mfc110u.dll文件丢失”。那么&#xff0c;mfc110u.dll是什么&#xff1f;为什么会出现丢失的情况呢&#xff1f;本文将为您详细介绍mfc110u.dll文件的含义、丢失原因以及解决方法。 首先&…

JavaScript-异常与this处理与性能优化

1. 深浅拷贝 const obj {uname: nidie,age: 18}// o对象直接复制obj&#xff0c;直接赋值将obj的地址也给了oconst o obj// 正常打印18console.log(o);// 对o改动&#xff0c;打印obj&#xff0c;obj也被改动了o.age 20console.log(o);console.log(obj);1.1 浅拷贝 拷贝对象…

AI日报:苹果为使用Mac的人工智能开发者推出开源工具

文章目录 总览主要介绍开发理念开发细节MLX功能用途 MLX可以用于商业软件吗&#xff1f; 总览 苹果正在为开发人员提供新的工具&#xff0c;用于在其硬件上训练和运行大型语言模型。 主要介绍 开发理念 苹果公司通过发布一系列新的开源人工智能工具&#xff0c;向开源人工智能…

java jvm堆内存分析工具MAT(导出运行中jvm堆内存、加载导出文件分析)

下载地址&#xff1a;https://eclipse.dev/mat/downloads.php 历史版本&#xff1a;https://eclipse.dev/mat/previousReleases.php jdk1.8这些老版本jdk需要使用历史版本的&#xff0c;我的是1.8&#xff0c;用的1.10的mat 我下载的地址&#xff1a;https://www.eclipse.org/d…

C# 使用异步委托获取线程返回值

写在前面 异步委托主要用于解决 ThreadPool.QueueUserWorkItem 没有提供获取线程执行完成后的返回值问题。异步委托只能在.Net Framework 框架下使用&#xff0c;.Net Core中会报平台错误&#xff0c;而且使用Task.Result来获取返回值&#xff0c;可以达成同样的目的&#xff…

区块链技术的未来,了解去中心化应用的新视角

小编介绍&#xff1a;10年专注商业模式设计及软件开发&#xff0c;擅长企业生态商业模式&#xff0c;商业零售会员增长裂变模式策划、商业闭环模式设计及方案落地&#xff1b;扶持10余个电商平台做到营收过千万&#xff0c;数百个平台达到百万会员&#xff0c;欢迎咨询。 随着…

Python与ArcGIS系列(十五)根据距离抓取字段

目录 0 简述1 实例需求2 arcpy开发脚本0 简述 在处理gis数据的时候,会遇到这种需求:将一个图层与另一个图层中相近的要素进行字段赋值。本篇将介绍如何利用arcpy及arcgis的工具箱实现这个功能。 1 实例需求 为了介绍这个功能的实现,我们需要有一个特定的功能需求。在这里选…

Mac如何设置control+space切换上一中输入法

#设置方法# *搜索输入法 系统设置-搜索&#xff1a;输入法&#xff0c;并点击键盘快捷键 *点击输入法&#xff0c;勾选&#xff1a;选择上一个输入法&#xff0c;点击完成。

ServletJSP

Servlet 1.Servlet生命周期 2.HttpServletRequest与HttpServletResponse 2.1HttpServletRequest 获取请求参数 请求乱码问题&#xff1a; 请求转发 request作用域 2.2HttpServletResponse 输出 乱码 重定向 3.Cookie 4.Sessions 5.ServletContext 获取方式及常用方法&a…

【Spring教程17】Spring框架实战:实例详解解读AOP通知类型的使用

欢迎大家回到《Java教程之Spring30天快速入门》&#xff0c;本教程所有示例均基于Maven实现&#xff0c;如果您对Maven还很陌生&#xff0c;请移步本人的博文《如何在windows11下安装Maven并配置以及 IDEA配置Maven环境》&#xff0c;本文的上一篇为《AOP配置管理中AOP切入点表…

ubuntu如何远程ssh登录Windows环境并执行测试命令

ubuntu如何远程ssh登录Windows环境并执行测试命令 1 paramiko模块简介1.1 安装paramiko1.2 paramiko基本用法1.2.1 创建SSHClient实例1.2.2 设置主机密钥策略1.2.3 连接SSH服务器1.2.4 执行命令1.2.5 关闭SSH连接1.2.6 异常处理 2 windows的配置2.1 启动OpenSSH服务2.2 配置防火…

JMeter直连数据库

JMeter直连数据库 使用场景操作步骤 使用场景 用作请求的参数化 登录时需要的用户名&#xff0c;密码可以从数据库中查询获取 用作结果的断言 添加购物车下订单&#xff0c;检查接口返回的订单号&#xff0c;是否与数据库中生成的订单号一致 清理垃圾数据 添加商品后&#xff…

Gin之GORM 操作数据库(MySQL)

GORM 简单介绍 GORM 是 Golang 的一个 orm 框架。简单说&#xff0c;ORM 就是通过实例对象的语法&#xff0c;完成关系型数据库的操作的技术&#xff0c;是"对象-关系映射"&#xff08;Object/Relational Mapping&#xff09; 的缩写。使用 ORM框架可以让我们更方便…

Kotlin+Apache HttpClient+代理服务器=高效的eBay图片爬虫

引入 你是否想过用Kotlin来编写爬虫程序&#xff1f;你是否想过用Apache HttpClient来处理HTTP请求和响应&#xff1f;你是否想过用代理服务器来绕过反爬措施&#xff1f;如果你的答案是肯定的&#xff0c;那么本文将为你介绍一种高效的eBay图片爬虫的实现方式&#xff0c;让你…

深入理解 Kafka 集群管理与最佳实践

构建和管理一个稳定、高性能的Kafka集群对于实现可靠的消息传递至关重要。本文将深入研究Kafka集群的各个方面&#xff0c;包括集群搭建、节点配置、分区与副本管理、安全性与监控&#xff0c;为读者提供全面的指导和实例代码。 1. 搭建 Kafka 集群 1.1 Broker 节点 在Kafka…

C++11 【初识】

C11简介 1.在2003年C标准委员会曾经提交了一份技术勘误表(简称TC1)&#xff0c;使得C03这个名字已经取代了C98称为C11之前的最新C标准名称。 2.不过由于C03(TC1)主要是对C98标准中的漏洞进行修复&#xff0c;语言的核心部分则没有改动&#xff0c;因此人们习惯性的把两个标准合…

java版Spring Cloud+Spring Boot+Mybatis之隐私计算 FATE - 多分类神经网络算法测试

一、说明 本文分享基于 Fate 使用 横向联邦 神经网络算法 对 多分类 的数据进行 模型训练&#xff0c;并使用该模型对数据进行 多分类预测。 二分类算法&#xff1a;是指待预测的 label 标签的取值只有两种&#xff1b;直白来讲就是每个实例的可能类别只有两种 (0 或者 1)&…

【运维】Kafka高可用: KRaft(不依赖zookeeper)集群搭建

文章目录 一. kafka kraft 集群介绍1. KRaft架构2. Controller 服务器3. Process Roles4. Quorum Voters 二. 集群安装1. 安装1.1. 配置1.2. 格式化 2. 启动测试2.1. 启功节点服务2.2. 测试 本文主要介绍了 kafka raft集群架构&#xff1a; 与旧架构的不同点&#xff0c;有哪些…