JavaWeb之Servlet

一、Servlet继承结构

顶级servlet接口—>genericServlet抽象类(重写除service外的方法)—>HttpServlet类(重写service方法)—>自定义servlet类

二、Servlet生命周期

在一个应用程序中,每种Servlet类型只能有一个实例,而控制制Servlet实例化时机的是loadOnStratup参数,此参数为-1时在第一次请求时实例化,为其他正整数时Tomcat(Servlet容器)根据从小到大的顺序在服务启动时实例化

三、ServletConfig与ServletContext

ServletConfig对象与ServletContext对象都是用来存储信息的(键值对)

1.ServletConfig对象

每个Servlet对象都有一个自己的ServletConfig对象,可以在通过xml或注解配置

<servlet>
    <servlet-name>servlet1</servlet-name>
    <servlet-class>com.atguigu.servlet.Servlet1</servlet-class>
    <!--配置servlet的初始化参数-->
    <init-param>
        <param-name>keya</param-name>
        <param-value>valueA</param-value>
    </init-param>
    <init-param>
        <param-name>keyb</param-name>
        <param-value>valueb</param-value>
    </init-param>
</servlet>

<servlet-mapping>
    <servlet-name>servlet1</servlet-name>
    <url-pattern>/servlet1</url-pattern>
</servlet-mapping>
@WebServlet(
    urlPatterns ="/serlvet1",
    initParams ={@WebInitparam(name="key2a",value ="value2a"),@WebInitParam(name="key2b",value ="value2b")}
)

在service方法中读取ServletConfig信息:

ServletConfig servletConfig =getServletConfig();
String keya =servletConfig.getInitParameter("keya");
System.out.println("keya:"+keya);

2.ServletContext对象

对于每一个应用程序,Servlet容器会创建一个ServletContext对象,这个对象中封装了上下文(应用程序)的环境详情

//在xml中配置
<context-param>
    <param-name>encoding</param-name>
    <param-value>UTF-8</param-value>
</context-param>
<context-param>
    <param-name>username</param-name>
    <param-value>zhangsan</param-value>
</context-param>

在service方法中获取ServletContext:

ServletContext servletContext =getServletContext();

ServletContext的其他API:

ServletContext servletContext = getServletContext();
// 返回资源的磁盘路径(绝对路径)
String realPath = servletContext.getRealPath("资源在web目录中的路径(如:/image/img1.png)");
// 资源的工程目录(iead中的目录)为"C:\IdeaProjects\myapp\web\image\img1.png"
// 返回值为 "C:\IdeaProjects\myapp\out\artifacts\myapp_war_exploded\image\img1.png"

// 获取项目的上下文路径(Javaweb项目的访问路径)(动态获取,防止项目名称变更时路径错误)
// 如果web应用部署在URL http://localhost:8080/myapp/ 上,那么 getContextPath 将返回 "/myapp"
String contextPath = servletContext.getContextPath();

同时,ServletContext也是三大域对象之一的应用域,与之相关的API如下:

// 向域中存储/修改数据
servletContext.setAttribute("kaya","valuea"); 
// 根据键查询
String kaya = (String)servletContext.getAttribute("ka");
// 删除
servletContext.removeAttribute("ka");

四、HttpServletRequest与HttpServletResponse

HttpServletRequest与HttpServletResponse是servlet对请求报文和响应报文的封装,由Servlet容器完成,无需我们手动处理,只需要了解相关API即可

1.HttpServletRequest

通过getXXX方法可以获得请求头内的信息

req.getMethod();//获取请求方式
req.getProtocol();//获取请求协议及版本
req.getRequestURI();//获取请求的uri | 项目内的资源路径
req.getRequestURL());//获取请求的url | 项目内资源的完成的路径


req.getLocalPort();//本应用容器的端口号  8080
req.getServerPort();//客户端发请求时使用的端口号
req.getRemotePort();//客户端软件的端口号

最常用的是获取请求头的请求参数

// 根据键获取值
String username = req.getParameter("username");
string userPwd = req.getParameter("userPwd");

// 获取数组参数(对应前端多选框等)
String[]hobbies = req.getParameterValues("hobby");

同时,HttpServletRequest也是三大域对象之一的请求域,与之相关的API如下:

// 向域中存储/修改数据
req.setAttribute("kaya","valuea"); 
// 根据键查询
String kaya = (String)req.getAttribute("ka");
// 删除
req.removeAttribute("ka");

注意:setAttribute设置的属性仅在服务器端可见,不能直接发送给客户端。

2.HttpServletResponse

可以设置响应报文的响应状态码、响应头等信息

resp.setStatus(200);  // 设置响应状态码

resp.setHeader("aaa","vaLuea");  // 在响应体中添加键值对信息

//resp,setHeader("Content-Type","text/htmL");  // 设置响应头
resp.setContentType("text/html");  // 简化写法

String info ="<h1>hello</h1>";
//resp.setHeader("Content-Length","1234");  // 设置响应体的(字节)长度
resp.setContentLength(info.getBytes().length);  // 简化写法
  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值