Web核心基础Servlet和Servlet容器

·关于tomcat
    ·
这里的tomcat也可以称为一种servlet容器,另外tomcat是一种web容器
        Web容器是Servlet容器的一个更广泛的概念,它不仅支持Servlet,还支持其他基于Web的应用程序。
        Web容器是一种服务程序,给处于其中的应用程序组件提供环境,使其直接跟容器中的环境变量交互,不必关注其它系统问题。

    ·类运行需要有实例化的动作,理解了这个动作,也就理解了web开发的大部分逻辑了:
       ·比如说我下面的这个MyServlet类,这只算一个类,并不能直接运行,他没有主方法的入口,更没有被加载到虚拟机中运行
        而
tomcat帮你把这个活干了,当你在浏览器请求这个资源时,他会自动帮你创建这个类的对象,也就是main()方法的作用,
        其实
main()方法就是Java提供的测试类,在我们学javaSE的时候,你写了一个javabean,一般就会通过main()方法测试程序是否正常
       ·实际上Tomcat需要main方法启动。 Tomcat需要监听本机上的某个端口(默认8080,如果端口被占用,tomcat就不能正常启动,常见的
        mysql默认端口号3306SQL server默认端口1433)。Tomcat需要抓取此端口上来自客户端的链接并获得请求调用的,
        方法与参数。
Tomcat需要根据请求调用的方法,动态地加载方法所在的类,完成类的实例化并通过该实例获得需要的方法
        最终将请求传入方法执行。也就是完成方法调用的过程

·关于MVC模式:
    ·MVC是一种分层开发的模式,其中:
        ·MModel,业务模型,在这里,m一般对应标准的javabean
        ·VView,视图,页面展示,在咱课里面,V就对应jsphtml文件
        ·CController,控制器,负责处理请求,调用模型和视图,在本门课中,C就对应Servlet相关的代码
    在
java标准开发中,mvc模式分别对应着三个不同的包,在每个包下面去写对应的代码

        ·通常,在模型和控制层中粘连着业务模块的逻辑,此时,如果把业务逻辑写在Servlet中,会大大提升Servlet类的复杂度,而且有些业务逻辑是会重用的,而每个Servlet类之间并不共享资源。所以,为了解耦,就把那些可以独立出来的业务逻辑单独的抽取到Service层中

        ·另外的,在标准开发中,数据库的连接和处理并不是在JSP中,DAO层从负责和数据库进行交互,做数据持久层的工作

        ·这里我只是对这些分层做一下简单的介绍,如果想进一步了解这些分层之间的逻辑和相关的涉及模式,可自行进一步了解。如果需求高的化,考虑出一期讲解。

package controller;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.BufferedReader;
import java.io.IOException;



//servlet的生命周期
//@WebServlet("/demo2")
/*
配置请求路劲,当tomcat启动之后,会把当前项目(这里的当前项目指:JSP_)都部署到tomcat上去,
我这里tomcat的默认请求路径是http://localhost:8080/
项目的默认访问路径是http://localhost:8080/jsp_,也就是在tomcat的请求路劲后面加上最大的那个项目名称,
请求路劲的信息一般会在运行窗口中显示
*/

@WebServlet("/myServlet")
public class MyServlet extends HttpServlet {

    /*
    直接通过浏览器访问servlet时,请求方式是get,get和post请求方式的区别是,post中请求数据是在请求体中的
    而get没有请求方式没有请求体,只有请求头,而且get请求方式能发送的数据长度是有限制的(数据长度因浏览器而异)
    理论上post提交方式没有大小限制,而且post可以提交封装过的数据,如最常见的json格式
    */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //tomcat会解析浏览器的请求数据,并封装在request中,把响应数据封装在response中,传给浏览器
        System.out.println("get...");


        //解决中文乱码问题:这里底层封装的是字符流,字符流的默认编码是ISO-8859,对中文支持不好,设置为utf-8就好了
        //但是字符流是post提交方式的底层,此设置只对post提交方式有效,get获取参数的方式:getQueryString()
        request.setCharacterEncoding("UTF-8");
        //get方法中文乱码请看MyServlet_2示例

          /*获取请求数据,request.getParameter();这个方法是最常用的,jsp中好像也只用到这个,另外两个我就不演示了
            因为如果用map集合的话,遍历数据会用到迭代器,也没这个必要
            字符串数组在接收同一个属性的多个值时才会用到
          */
        //使用request对象 接收浏览器的请求数据
        String name = request.getParameter("name");
        //请求格式:url?name=zhangsan
        //例如本类中为 http://localhost:8080/jsp_/myServlet?name=zhangsan
        String password = request.getParameter("password");



        //使用response对象 设置响应数据    响应数据就是给浏览器的东西
        //content-type:声明响应的数据是html格式的,响应到浏览器,浏览器自己进行解析
        response.setHeader("content-type","text/html;charset=UTF-8");



        /*
        通过response.getWriter().write();把数据写入浏览器 ,即做出响应
        这里的response.getWriter()对象是从Web容器中获取到的,而不是你新创建的,web容器(这里指tomcat)加载servlet的时候已经为你创建好了对象,
        你只要获取到然后使用就可以了!请求和响应数据都基于一个流的前提下才有意义。如果自己创建的对象,是不能跨平台传输和共享的。看懂上面的关于tomcat的应
	该能理解
        */
        response.getWriter().write("<h1>"+name+",欢迎您!</h1>");

        System.out.println(name);
        System.out.println(password);


        //转发:发生在服务器内部,浏览器的地址栏不会发生变化,转发能够进行资源共享
//        request.getRequestDispatcher("hello.jsp").forward(request,response);

        //重定向:发生在浏览器,当重定向到另一个资源时,页面会发生跳转,生成一个新的页面
        //重定向可以理解为服务器给浏览器的响应是一次资源的重新请求,不能进行资源共享
        response.sendRedirect("hello.jsp");

    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       //获取post 请求体:请求参数
        System.out.println("post...");


        /*
        这里用字符流的话,算是底层了,如果不想了了解底层的话,可以直接看request通用的获取请求参数(doGet()和doPost()):都可以用
         Map<String,String[]> getParameterMap():获取所有参数Map集合
         String[] getParameterValues(String name):根据名称获取参数值(数组)
         String getParameter(String name):根据名称获取参数值(单个值)
        */
        //1、获取  字符输入流
        BufferedReader reader = request.getReader();
        //读取数据
        String line = reader.readLine();
        System.out.println(line);

//字符流和字节流是其他的知识点,属于Java基础了,
        /*
        简单提一下
        大多数应用程序都需要实现与设备之间的数据传输,在Java中,将这种通过不同输入输出设备(例如:输入设备、内存、显示器、网络等)
        之间的数据传输抽象的表述为“流”,程序允许通过流的方式与输入输出设备进行数据传输。Java中的“流”都位于Java.io包中,
        称之为IO(输入输出)流。 IO流,即InputOutput的缩写。

        Java IO库有两个支系:

        面向字节流的InputStream和OutputStream
        面向字符的Reader和Writer
        java流在处理上分为字符流和字节流。实际上字节流的InputStream和OutputStream是一切的基础。实际总线中流动的只有字节流。需要
        对字节流做特殊解码才能得到字符流。Java中负责从字节流向字符流解码的桥梁是:InputStreamReader和InputStreamWriter。

         */



    }
}

<%--
  Created by IntelliJ IDEA.
  User: 南潮
  Date: 2023.10.15
  Time: 16:28
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" %>
<html>
<head>
    <title>Title</title>
</head>
<body>

    <h1>hello jsp</h1>
    <%
        out.print("hello SP");
    %>
        <form action="myServlet" method="post">
            <input type="text" name = "username">
            <input type="password" name = "password">
            <input type="checkbox" name="hobby" value="1">游泳
            <input type="checkbox" name="hobby" value="2">爬山<br>
            <input type="submit">
        </form>
</body>
</html>

package controller;

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


@WebServlet("/myServlet1")
public class MyServlet_1 extends HttpServlet {


    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {


        request.setCharacterEncoding("UTF-8");


        String name = request.getParameter("name");
        String password = request.getParameter("password");

        response.setHeader("content-type","text/html;charset=UTF-8");

        response.getWriter().write("<h1>"+name+",欢迎您!</h1>");
        System.out.println(name);
        System.out.println("servlet1");
        System.out.println(password);

    }

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


    }
}

package controller;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.nio.charset.StandardCharsets;


@WebServlet("/myServlet2")
public class MyServlet_2 extends HttpServlet {


    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {


        String name = request.getParameter("name");
        String password = request.getParameter("password");

        /*
        乱码原因:tomcat进行URL解码时,默认的字符集是ISO-8859
        只需要将乱码字符还原为字节数组,再按照utf-8的方式解码得到原来的字符串
        其实这个给是最终极的乱码解决方案,直接拿到原数据进行还原,但是过程比较复杂,逻辑也多一点,
        我们对get请求方式的解决乱码问题不做要求,所有就直接写能解决post那个就可以了
        乱码这里如果搞不懂,可以不管,考试的时候就直接别写了,那也不算错
        */

        byte[] bytes = name.getBytes(StandardCharsets.ISO_8859_1);
        name = new String(bytes,StandardCharsets.UTF_8);

        response.setHeader("content-type","text/html;charset=UTF-8");


        response.getWriter().write("<h1>"+name+",欢迎您!</h1>");
        System.out.println(name);
        System.out.println(password);


    }

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


    }
}


 

<%--
  Created by IntelliJ IDEA.
  User: 南潮
  Date: 2023.10.15
  Time: 16:28
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" %>
<html>
<head>
    <title>Title</title>
</head>
<body>

    <h1>hello jsp</h1>
    <%
        out.print("hello SP");
    %>
        <form action="myServlet2" method="get">
            <input type="text" name = "name">
            <input type="password" name = "password">
            <%--<input type="checkbox" name="hobby" value="1">游泳
            <input type="checkbox" name="hobby" value="2">爬山<br>--%>
            <input type="submit">
        </form>
</body>
</html>

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

总是穿一件花外衣

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值