超详细Servlet讲解

Servlet详解

概述:sun公司开发动态web的一门技术,在这些API中提供了个接口叫Servlet,开发一个Servlet程序只需要编写接口的实现类,并部署到web服务器中。

Servlet配置步骤
  1. 构建一个普通maven项目,删掉src包,作为maven主工程。在pom.xml中添加servlet,jsp的依赖。直接网上搜maven repository,在里面根据关键字搜索,找个靠谱的把代码粘贴到新建的<dependencies>标签里,报红线点开maven右边栏刷新下载即可,如

    <dependencies>
            <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
            <dependency>
                <groupId>javax.servlet</groupId>
                <artifactId>javax.servlet-api</artifactId>
                <version>4.0.1</version>
            </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.1</version>
                <scope>provided</scope>
            </dependency>
    
        </dependencies>
    
  2. 在主项目里创建子Moudel,点上小对勾,选中maven-...-webapp,再给子项目起名,然后查看目录、配置文件、仓库的路径对不对(可能会默认在C盘新建),子工程就建好了。

    主项目的pom.xml文件中会有<modules>标签,子项目会自动继承,相当于有<parent>标签,主项目中的jar包子项目可以直接使用

  3. maven环境优化,修改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"
             metadata-complete="true">
    </web-app>
    

    再讲maven结构搭建完整,在main目录下补java目录和resources

  4. 编写Servlet程序,即创建实现类继承HttpServlet(一个Servlet的半实现类),重写主要方法

    public class HelloServelt extends HttpServlet {
        //get和post只是请求实现的不同方式,业务逻辑一样,可以互相调用
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            PrintWriter writer = resp.getWriter();//响应流
            writer.println("Hello,servlet!!!");//页面显示
            System.out.println("进入doGet");//控制台打印
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doGet(req, resp);
        }
    }
    
  5. 注册及编写servlet的映射(在web.xml中)

    因为Java程序要通过浏览器访问,浏览器连接web服务器,所以我们需要在web服务器中注册写的servlet,提供一个访问路径

    <!--注册servlet-->
      <servlet>
        <servlet-name>hello</servlet-name>
        <servlet-class>com.Yong.servlet.HelloServelt</servlet-class>
      </servlet>
    
      <!--servlet的请求路径,注意前面加“/”-->
      <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/Hello</url-pattern>
      </servlet-mapping>
    
  6. 配置tomcat

    点击工具栏的run,Edit Configurations,点加号,选small tomcat,修改name为Tomcat 9(好看而已),根据需求看是否要该项目路径,默认为子项目名,applyok

  7. 启动测试,localhost:8080/项目路径/servlet请求路径,会生成一个target

Ps:Mapping问题

一个servlet可以指定一个映射路径(如上文),也可以指定多个路径,通用路径,指定后缀前缀(*.)等,只写/*为默认路径。但指定的固有映射路径优先级最高,找不到才回去走默认路径。


Servlet运行原理


ServletContext

概述:web容器在启动时,会为每一个web程序创建一个对应的ServletContext对象,来代表当前的web应用。常用于共享和保存数据。主要功能有:

  1. 可通过对象.setAttribute(属性,值对象)设置属性并赋值(类似于键值对),同一个包下其他servlet程序通过this.getServletContext()获取该对象,再调用getAttribute(属性)取值,需要强制转型。
  2. 获取初始化参数:先在web.xml中添加参数标签,再调用getInitParameter()
  3. 请求转发:getRequestDispatcher("/请求路径").forward(req,reps),相当于自己访问不到委托别人去访问,但还是自己的路径不变。
  4. 读取资源文件propertiesgetResourceAsStream("/资源路径"),再new Properties().load(流对象)下载流,prop.getProperty(资源文件里的属性)取值。

HttpServletResponse

背景:服务器在接到浏览器得http请求后,会分别创建HttpServletResponse和HttpServletRequest对象,用于存放响应信息和请求参数。

常见应用:

  1. 向浏览器输出消息

    getOutputStream()getWriter()(有中文字符时使用,可能造成字符串丢失),还有对应的向浏览器发送响应头,响应状态码的方法

  2. 下载文件

    //1. 获取要下载文件的路径
            String realPath = "D:\\IDEA\\javaweb-02-servlet\\response\\src\\main\\resources\\1.jpg";
            //2. 获取下载的文件名,通过路径最后一个”/“后的字符串,第一个”/“是转义字符
            String filename = realPath.substring(realPath.lastIndexOf("\\")+1);
            //3. 设置让浏览器支持下载,搜索下载文件的消息头头格式(响应的配置信息,包含附件)
            resp.setContentType("text/html;charset=UTF-8");//浏览器根据该类型来指定程序解析对应类型的文件
            resp.setHeader("Content-Disposition","attachment;filename="+filename);
            //4. 获取下载文件的输入流
            FileInputStream is = new FileInputStream(realPath);
            //5. 创建缓冲区
            int len = 0;
            byte[] buffer = new byte[1024];
            //6. 获取OutputStream输出流对象
            ServletOutputStream os = resp.getOutputStream();
            //7. 将输入流写入缓冲区,使用输出流将缓冲区中的数据送到客户端
            while ((len = is.read(buffer)) != -1){
                os.write(buffer,0,len);
            }
            is.close();//释放资源
            os.close();
            //注册servlet并编写映射
            //配置tomcat,把deployment目录设置为当前子项目的webapp
    
HttpServletRequest

与Response相对,有许多get开头的方法可以获取前端参数信息,还主要应用于请求转发。


页面跳转
  • 重定向(302)

    一种客户端行文,从本质上讲等同于两次请求,前一次请求对象不会保存,地址栏的URL会改变。resp.sendRedirect("/项目路径/其他servlet地址")

  • 请求转发(307)

    一种服务器的行为,客户端只有一次请求,服务器端转发后会将请求对象保存,地址栏中的URL地址不会改变,得到响应后服务器端再将响应发给客户端。

    req.getRequestDispatcher("/其他servlet地址").forward(req,resp);

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值