javaWeb—Servlet

servlet

servlet是一门开发多态web的技术

一、实现servlet程序

创建maven父子工程

把之后的maven项目当作父工程的模块使用

  • 创建父工程:创建一个maven空项目,之后把src目录删掉。当作父工程使用,把依赖包安装在父工程的pom.xml,子工程可以使用
  • 在父工程中创建maven模块

在这里插入图片描述

子工程创建一个Servlet程序

在java目录下,创建一个继承HttpServlet的类

package com.szz.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.*;
import java.io.IOException;
import java.io.PrintWriter;

public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("进入doGet方法");
        PrintWriter writer = resp.getWriter();
        writer.print("Hello Servlet");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException, ServletException {
        doGet(req,resp);
    }
}

此时由于没有HttpServlet,会报错,安装其依赖即可。本人这里安装依赖后一直报找不到javax.servlet

我的解决方法:

  • 使用tomcat的Servlet-api
<dependency>
    <groupId>tomcat</groupId>
    <artifactId>servlet-api</artifactId>
    <version>5.5.23</version>
</dependency>

设置映射,在web.xml文件中设置servlet映射

<servlet>
    <servlet-name>Hello</servlet-name>
    <servlet-class>com.szz.servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>Hello</servlet-name>
    <url-pattern>/hello</url-pattern>
</servlet-mapping>

此时就可以运行tomcat了,在路径后面拼接/hello,就可以读到com.szz.servlet.HelloServlet类下设置的doGet方法的响应内容。

二、ServletContext对象

ServletContext是上下文对象,可以使servlet之间进行数据的共享

数据共享

例子:

设置属性,供别的servlet获取

package com.szz.servlet;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.*;
import java.io.IOException;

/*
* 该类通过ServletContext上下文设置属性,供其他Servlet类使用
* */
public class SetData extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取servletcontext
        ServletContext context = this.getServletContext();
        //设置共享属性
        String username="小明";
        context.setAttribute("username",username);

        //设置响应体的类型与编码
        resp.setContentType("text/html");
        resp.setCharacterEncoding("UTF-8");
        resp.getWriter().print("我共享的数据:"+username);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

获取上面共享的数据

package com.szz.servlet;

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

//该类通过ServletContext来获取共享的数据
public class GetData extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取共享的数据
        ServletContext context = this.getServletContext();
        String username =(String) context.getAttribute("username");

        //设置响应体
        resp.setContentType("text/html");
        resp.setCharacterEncoding("UTF-8");
        resp.getWriter().print("我拿到的共享数据:"+username);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

在web.xml文件中,设置好这两个类的映射

<servlet>
    <servlet-name>setData</servlet-name>
    <servlet-class>com.szz.servlet.SetData</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>setData</servlet-name>
    <url-pattern>/setdata</url-pattern>
</servlet-mapping>

<servlet>
    <servlet-name>getData</servlet-name>
    <servlet-class>com.szz.servlet.GetData</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>getData</servlet-name>
    <url-pattern>/getdata</url-pattern>
</servlet-mapping>

运行结果

在这里插入图片描述


在这里插入图片描述

获取初始化参数

在web.xml文件中添加参数代码

<!--  设置初始化参数,不怎么用-->
  <context-param>
    <param-name>username</param-name>
    <param-value>sister</param-value>
  </context-param>

在servlet文件中来获取String username = servletContext.getInitParameter("username");

package com.szz.servlet;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.*;
import java.io.IOException;
import java.io.PrintWriter;

public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("进入doGet方法");
        ServletContext servletContext = this.getServletContext();
        //获取初始化参数
        String username = servletContext.getInitParameter("username");
        PrintWriter writer = resp.getWriter();
        writer.print("Hello Servlet"+username);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException, ServletException {
       doGet(req, resp);
    }
}

读取资源文件

项目打包后都放在classes,我们称为classpath

资源文件

username=toney

读取资源文件

package com.szz.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.InputStream;
import java.util.Properties;

//读取资源文件
public class Servlet01 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取资源文件
        InputStream inputStream = this.getServletContext().getResourceAsStream("/WEB-INF/classes/test.properties");
        Properties properties = new Properties();
        properties.load(inputStream);
        //获取资源文件的属性
        String username = properties.getProperty("username");

        resp.setContentType("text/html");
        resp.setCharacterEncoding("UTF-8");
        resp.getWriter().print("资源文件的内容username:"+username);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

三、HttpServletResponse对象

响应对象,设置发给客户端的响应头部以及响应内容

常用方法
方法名描述例子
void sendRedirect(String var1) throws IOException;设置重定向resp.sendRedirect(“/项目根路径/跳转的页面(或路由)”),不加项目根路径会报错假设项目启动路径是localhost:8080/r,resp.sendRedirect(“/r/跳转的页面(或路由)”)
void setHeader(String var1, String var2);设置响应体头部信息,比如设置编码,文件类型等等resp.setHeader(“Content-Type”,“text/html;charset=UTF-8”)
int getStatus();获取状态码
void addCookie(Cookie var1);添加cookieresp.addCookie(new Cookie(“name”,“value”))

四、HttpServletRequest对象

接受客户端传过来的信息

常用方法
方法名描述例子
String getParameter(String var1);拿指定的name获取value;这个name与前端做好约定req.getParameter(“username”);
String[] getParameterValues(String var1);拿指定的name获取多个value;这个name与前端做好约定,比如复选框req.getParameter(“checkbox”);
Cookie[] getCookies();获取客户端携带过来的cookie信息req.getCookies()
HttpSession getSession();获取客户端的sessionreq.getSession()

五、编码解码

有时候数据出现乱码,可以通过编码解码的方式解决(只是其中一种)

URLEncoder.encode("实打实打算","UTF-8");//编码
URLDecoder.decode("编码的对象""UTF-8");//解码
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值