JavaWeb学习笔记5—Servlet

学习视频地址Java Web 尚硅谷

狂神讲的maven配置和Servlet可以作为补充

<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
        <dependency>
            <groupId>javax.servlet</groupId>
           <artifactId>javax.servlet-api</artifactId>
          <version>4.0.1</version>
          <scope>provided</scope>
        </dependency>
        <!-- https://mvnrepository.com/artifact/javax.servlet.jsp/javax.servlet.jsp-api -->
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>javax.servlet.jsp-api</artifactId>
            <version>2.3.3</version>
            <scope>provided</scope>
        </dependency>

image-20220205203538856

image-20220205204159613

image-20220205205000791

image-20220205205349853

继承servlet后 重写的方法后关注的生命周期,一般继承Httpservlet主要写service方法。

1.servlet继承体系

image-20220205212311644

2.ServletConfig类 3个作用

在init方法中使用:

image-20220205214238041

获取web.xml中的对应的参数

image-20220205214506705

注意:如下:只在单独的helloServlet2 中可以获取,因为web.xml中就写在了单独的某个Servlet。

image-20220205221151897

image-20220205214619080

image-20220205214740200

image-20220205220817991

也可以在其他方法中使用

3.ServletContext类4个作用

image-20220206124133993

image-20220205222336227

image-20220205222517627

ServletContext只能获取context-prarm, 上一节提到的init-param是ServletConfig才能获取的。

image-20220205223723593

idea发布的 对应工程的web目录 就是把源码 web目录下的内容+字节码部署到这个路径下了

这个路径是编译完后的字节文件路径,是下面out文件的输出路径

@Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext servletContext = getServletContext();
        servletContext.setAttribute("key1","value1");

    }

context对象的作用就是 每一个Servlet是共用的,相互之间都可以拿到配置的信息。

4.HttpServletRequest

每次请求进来就会创建一个

image-20220206172231306

注意:URL = 协议 + 主机 + 端口号 + URI image-20220206172523967

@WebServlet(name = "RequestAPIServlet", value = "/RequestAPIServlet")
public class RequestAPIServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println(request.getRequestURI());
        System.out.println(request.getRequestURL());
        System.out.println("客户端IP地址:"+request.getRemoteHost());
        String requestHeader = request.getHeader("User-Agent");
        System.out.println(requestHeader);
        System.out.println(request.getMethod());
        ///servlet_demo01/RequestAPIServlet
        //http://localhost:8080/servlet_demo01/RequestAPIServlet
        //客户端IP地址:127.0.0.1
        //Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:89.0) Gecko/20100101 Firefox/89.0
        //GET
        
        
    }

参数处理:

image-20220206181205539

image-20220206181254806

image-20220206181546292

乱码问题:

image-20220206181927523

image-20220206182053611

注意:设置字符集必须要放在最前面。先获取参数,后设置,无效。

5.请求转发

  • 浏览器地址没有变

  • 他们是一次请求

  • 他们共享request域中的数据

  • 可以转发web-inf目录下(web-inf目录是不可以浏览器地址直接访问的)

  • 不可访问工程以外的地址

    image-20220206184701554

    image-20220206184718822

image-20220206182615238

image-20220206183144539

public class Servlet1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        // 获取请求的参数(办事的材料)查看
        String username = req.getParameter("username");
        System.out.println("在Servlet1(柜台1)中查看参数(材料):" + username);

        // 给材料 盖一个章,并传递到Servlet2(柜台 2)去查看
        req.setAttribute("key1","柜台1的章");

        // 问路:Servlet2(柜台 2)怎么走
        /**
         * 请求转发必须要以斜杠打头,/ 斜杠表示地址为:http://ip:port/工程名/ , 映射到IDEA代码的web目录<br/>
         *
         */
        RequestDispatcher requestDispatcher = req.getRequestDispatcher("/servlet2");
//        RequestDispatcher requestDispatcher = req.getRequestDispatcher("http://www.baidu.com");

        // 走向Sevlet2(柜台 2)
        requestDispatcher.forward(req,resp);

    }
}

请求转发必须要以斜杠打头,/ 斜杠表示地址为:http://ip:port/工程名/ , 映射到IDEA代码的web目录

请求转发必须要以斜杠打头,/ 斜杠表示地址为:http://ip:port/工程名/ , 映射到IDEA代码的web目录

请求转发必须要以斜杠打头,/ 斜杠表示地址为:http://ip:port/工程名/ , 映射到IDEA代码的web目录

public class Servlet2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 获取请求的参数(办事的材料)查看
        String username = req.getParameter("username");
        System.out.println("在Servlet2(柜台2)中查看参数(材料):" + username);

        // 查看 柜台1 是否有盖章
        Object key1 = req.getAttribute("key1");
        System.out.println("柜台1是否有章:" + key1);

        // 处理自己的业务
        System.out.println("Servlet2 处理自己的业务 ");
    }
}

6.base标签的作用

解决的问题就是

正常使用的a标签跳转,跳转后地址栏改变,然后点击回到上一页面,正常运行。

如果是请求转发过来的,点击回到上一页,因为地址栏没有改动到当前页面,所以会发生错误。

页面有base标签时,点击回到上一页,先参考设置的地址,作为当前地址,而不是地址栏的地址。

image-20220206194438790

image-20220206194542293

image-20220206194812745

image-20220206195021767

7.Web中 / 的意义

image-20220206200451653

8.HttpServletResponse

image-20220206211002521

image-20220206211653469

不能同时使用,控制台会报错。

解决乱码:

设置响应头的内容都需要在获取流对象之前才可以

 @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       // System.out.println(response.getCharacterEncoding());//ISO-8859-1
        response.setCharacterEncoding("utf-8");
        //浏览器使用的GBK
        //让浏览器也使用utf-8
        response.setHeader("Content-Type","text/html;charset = utf-8");
        //resp.setContentType("text/html;charset=utf-8") 用这一句也能解决 他相当于上面两句
        PrintWriter writer = response.getWriter();
        writer.write("response");
        writer.write("数据");
    }

image-20220206221829422

9.请求重定向

image-20220206222349863

image-20220206222937812

image-20220206223148328

image-20220207000242544

这里的req.setAttribute和getServletContext().setAttribute 不一样,重定向 Context()的Attribute是可以获取到的

image-20220207000358541

推荐使用的方法:

image-20220207102548369

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值