Servlet,Http(get和post请求),HttpServletRequest和HttpServletReponse

8 篇文章 0 订阅

案例1(http请求):
新建一个登陆表单,demo.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<!--
  超链接,提交表单都属于http请求
  一次请求中包含:请求行,请求头,请求体(表单post提交数据)

  目前将http请求分为get和post:
  get:
   1.超链接
   2.在浏览器地址栏中直接输入地址访问
   3.js window.open(url)
      location.assign(url);
      location.replace(url);
   4.表单 method="get"
  post:
    表单 method="post"

  get
    主要用于从服务器获取数据
    也可以向服务器发送数据,数据在地址中传递,会在地址栏中显示
    长度有限制
    相对不安全
  post
    主要用于向服务器发送数据
    提交数据在请求体中发送,长度没有限制(例如可以提交文件),
    数据在请求体中相对安全
-->
 <a href="login?name=张三&age=11">访问</a>

 <form action="login" method="post">
     账号<input type="text" name="account"> <br/>
     密码<input type="password" name="password"> <br/>
     性别<input type="radio" name="sex" value=""><input type="radio" name="sex" value=""><br/>
     职业:<select name="job">
               <option value="java工程师">java工程师</option>
               <option value="c++工程师">c++工程师</option>
               <option value="python工程师">python工程师</option>
          </select><br/>
     课程<input type="checkbox" name="course" value="python">python
         <input type="checkbox" name="course" value="java">java
         <input type="checkbox" name="course" value="C++">C++
         <input type="checkbox" name="course" value="c">c
      <input type="submit" value="登录">
 </form>
</body>
</html>

selvelt搭建:

package com.ff.firstWeb.servlet;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/*
  servlet搭建
    继承HttpServlet 实现  Servlet   init service destroy
    重写父类方法
 */
public class LoginServlet extends HttpServlet {

    /*
        在客户端第一次访问LoginServlet时创建,服务器时创建
        只被调用一次,只创建一个servlet对象 单实例的
     */
    public LoginServlet() {
        System.out.println("LoginServlet无参构造方法");
    }

    /*
     初始化,在对象创建后,构造方法执行后,调用init方法,完成一些初始化操作
     只执行一次
      如何没有初始化操作,可以不用重写init(),但是服务器仍然会调用init(),调用父类中
     */
    @Override
    public void init(ServletConfig config) throws ServletException {
        System.out.println("init");
        System.out.println(config.getInitParameter("count"));
    }

    /*
      提供服务器,
      每次请求都会调用service
     */
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("service");
    }

    /*
     在服务器关闭前,servlet销毁之前调用,
     只执行一次
     可以在此方法中完成一些最终操作:例如保存日志,数据备份
     如何没有最终操作,可以不用重写destroy(),但是服务器仍然会调用destroy(),调用父类中
     */
    @Override
    public void destroy() {
        System.out.println("destroy");
    }
}

配置:

<?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">
    <!--
      xml 可扩展标记语言,主要用于存储数据
      web.xml 存储web项目的配置信息,在服务器启动时,由服务器读取
     -->
    <!--配置servlet-->
    <servlet>
        <servlet-name>login</servlet-name>
        <servlet-class>com.ff.firstWeb.servlet.LoginServlet</servlet-class><!--反射机制可以根据类的地址动态创建对象-->
        <!--配置初始化参数-->
        <init-param>
            <param-name>count</param-name>
            <param-value>10</param-value>
        </init-param>
        <load-on-startup>0</load-on-startup><!--值<0 第一次访问时创建,>=0服务器启动时创-->
    </servlet>

    <!--给servlet配置一个访问地址,映射地址-->
    <servlet-mapping>
        <servlet-name>login</servlet-name>
        <url-pattern>/login</url-pattern><!--映射地址,以/开头-->
    </servlet-mapping>
    
    <welcome-file-list>
        <welcome-file>demo.html</welcome-file>
    </welcome-file-list> 
</web-app>

运行结果部分截图:
在这里插入图片描述
Servlet生命周期:
在这里插入图片描述

案例2:
新建表单,demo.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<!--
  超链接,提交表单都属于http请求
  一次请求中包含:请求行,请求头,请求体(表单post提交数据)

  目前将http请求分为:
  get
   超链接
   在浏览器地址栏中直接输入地址访问
   js window.open(url)
      location.assign(url);
      location.replace(url);
   表单 method="get"
  post
    表单 method="post"

  get
    主要用于从服务器获取数据
    也可以向服务器发送数据,数据在地址中传递,会在地址栏中显示
    长度有限制
    相对不安全
  post
    主要用于向服务器发送数据
    提交数据在请求体中发送,长度没有限制(例如可以提交文件),
    数据在请求体中相对安全


-->
 <a href="login?name=张三&age=11">访问</a>

 <form action="login" method="post">
     账号<input type="text" name="account"> <br/>
     密码<input type="password" name="password"> <br/>
     性别<input type="radio" name="sex" value=""><input type="radio" name="sex" value=""><br/>
     职业:<select name="job">
               <option value="java工程师">java工程师</option>
               <option value="c++工程师">c++工程师</option>
               <option value="python工程师">python工程师</option>
          </select><br/>
     课程<input type="checkbox" name="course" value="python">python
         <input type="checkbox" name="course" value="java">java
         <input type="checkbox" name="course" value="C++">C++
         <input type="checkbox" name="course" value="c">c
      <input type="submit" value="登录">
 </form>
</body>
</html>

servlet 搭建:

package com.ff.firstWeb.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/*
  servlet搭建
    继承HttpServlet 实现  Servlet   init service destroy
    重写父类方法
 */
public class LoginServlet_back extends HttpServlet {

    /*
        在客户端第一次访问LoginServlet时创建,服务器时创建
        只被调用一次,只创建一个servlet对象 单实例的
     */
   /*public LoginServlet() {
        System.out.println("LoginServlet无参构造方法");
    }*/

    /*
     初始化,在对象创建后,构造方法执行后,调用init方法,完成一些初始化操作
     只执行一次
      如何没有初始化操作,可以不用重写init(),但是服务器仍然会调用init(),调用父类中
     */
   /* @Override
    public void init(ServletConfig config) throws ServletException {
        System.out.println("init");
        System.out.println(config.getInitParameter("count"));
    }*/

    /*
      提供服务器,
      每次请求都会调用service
     */
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("service");
    }

    /*
     在服务器关闭前,servlet销毁之前调用,
     只执行一次
     可以在此方法中完成一些最终操作:例如保存日志,数据备份
     如何没有最终操作,可以不用重写destroy(),但是服务器仍然会调用destroy(),调用父类中
     */
    /*@Override
    public void destroy() {
        System.out.println("destroy");
    }*/
}

案例3(接受请求中的数据):

package com.ff.firstWeb.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Arrays;
import java.util.Enumeration;

/*
  servlet搭建
    继承HttpServlet 实现  Servlet   init service destroy
    重写父类方法
 */
public class LoginServlet_back1 extends HttpServlet {
    //无参构造默认就有
    //init 可以调用父类的
    //service   可以调用父类的 在父类中判断请求方式  get请求--doGet()  post请求-doPost()
    //org.apache.catalina.connector.RequestFacade
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //System.out.println("doGet"+req);
         //接收请求中的数据(自己提交的数据)
        String name = req.getParameter("name");
        String age = req.getParameter("age");
        System.out.println(name+"::"+age);
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置请求数据解码格式
        req.setCharacterEncoding("utf-8");

        //System.out.println("doPost"+req);
        //接收请求中的数据(自己提交的数据)
        String account = req.getParameter("account");
        String password = req.getParameter("password");
        String sex = req.getParameter("sex");
        String job = req.getParameter("job");
        String[] course = req.getParameterValues("course");
        System.out.println(account+"::"+password+"::"+sex+"::"+job+"::"+ Arrays.toString(course));

        //接收请求中的数据(请求行,请求头,请求体)
        System.out.println(req.getMethod());
        System.out.println(req.getRemoteAddr());//获得客户端ip
        System.out.println(req.getServerName());//获得服务器主机名  ip/域名
        System.out.println(req.getServerPort());//服务器端口号

        System.out.println(req.getScheme());
        System.out.println(req.getProtocol());
        System.out.println(req.getContentType());
        System.out.println(req.getContentLength());
        System.out.println(req.getContextPath());//获得项目的根路径
        System.out.println(req.getHeader("User-Agent"));//根据请求的名字获得值
        Enumeration<String> headerNames = req.getHeaderNames();//获得所有请求的名字
              while(headerNames.hasMoreElements()){
                  String name = headerNames.nextElement();
                  System.out.println(name+"::"+req.getHeader(name));
              }

        //调用其他java程序进行处理(例如与数据交互)
//课后练习
    }
    //destroy可以调用父类的
}

案例4(接受请求中的数据,做出响应):

package com.ff.firstWeb.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

/*
  servlet搭建
    继承HttpServlet 实现  Servlet   init service destroy
    重写父类方法
 */
public class LoginServlet_back2 extends HttpServlet {
    //无参构造默认就有
    //init 可以调用父类的
    //service   可以调用父类的 在父类中判断请求方式  get请求--doGet()  post请求-doPost()
    //org.apache.catalina.connector.RequestFacade
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //System.out.println("doGet"+req);
         //接收请求中的数据(自己提交的数据)
        String name = req.getParameter("name");
        String age = req.getParameter("age");
        System.out.println(name+"::"+age);
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置请求数据解码格式
        req.setCharacterEncoding("utf-8");

        //接收请求中的数据(自己提交的数据)
        String account = req.getParameter("account");
        String password = req.getParameter("password");

        //调用其他java程序进行处理(例如与数据交互)


        // System.out.println(10/0);

        //向客户端做出响应  本质使用IO 字符输出流
        //设置响应内容的编码格式

        //resp.setContentType("text/html;charset=utf-8");
        resp.setHeader("content-type", "text/html;charset=utf-8");
        PrintWriter out = resp.getWriter();
        if(account.equals("admin")&&password.equals("111")){
                  out.print("<h2>登录成功</h2>");
        }else{
                  out.print("<h2>账号或密码错误</h2>");
        }
    }

    //destroy可以调用父类的
}

案例5(有弊端,引出jsp):

package com.ff.firstWeb.servlet;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.Enumeration;

/*
  servlet搭建
    继承HttpServlet 实现  Servlet   init service destroy
    重写父类方法
 */
public class LoginServlet extends HttpServlet {
    //无参构造默认就有
    //init 可以调用父类的
    //service   可以调用父类的 在父类中判断请求方式  get请求--doGet()  post请求-doPost()
    //org.apache.catalina.connector.RequestFacade
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //System.out.println("doGet"+req);
         //接收请求中的数据(自己提交的数据)
        String name = req.getParameter("name");
        String age = req.getParameter("age");
        System.out.println(name+"::"+age);
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置请求数据解码格式
        req.setCharacterEncoding("utf-8");

        //接收请求中的数据(自己提交的数据)
        String account = req.getParameter("account");
        String password = req.getParameter("password");

        //调用其他java程序进行处理(例如与数据交互)
        //创建管理员表 id,账号,密码    jdbc验证账号密码是否正确
        //创建管理员登录日志表, id,账号,ip,登录时间    登录成功后保存登录日志


        //向客户端做出响应  本质使用IO 字符输出流
        resp.setHeader("content-type", "text/html;charset=utf-8");
        PrintWriter out = resp.getWriter();
        if(account.equals("admin")&&password.equals("111")){
            //早期的动态(数据可以动态从数据库获取)页面就是从serlet中输出的
                 /* out.print("<html>");
                      out.print("<head>");
                      out.print("</head>");
                      out.print("<body>");
                        for (int i = 0; i < 10; i++) {
                            out.print("<h1>"+i+"</h1>");
                        }
                      out.print("</body>");
                  out.print("<html>");*/

                  //问题:响应的页面非常复杂
                  //解决办法:使用jsp的动态页面,本质也是serlet,作用就是向客户端响应内容,引出jsp

        }else{
                  out.print("<h2>账号或密码错误</h2>");
        }
    }

    //destroy可以调用父类的
}

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值