GenericServlet、HttpServlet、HttpServletRequest、HttpServletResponse、转发和重定向
自定义写一个MyGenericServlet.java实现Servlet、ServletConfig接口//自定义一个MyGenericServletpublic abstract class MyGenericServlet implements Servlet , ServletConfig {private ServletConfig config;@Override
自定义写一个MyGenericServlet.java实现Servlet、ServletConfig接口
//自定义一个MyGenericServlet
public abstract class MyGenericServlet implements Servlet , ServletConfig {
private ServletConfig config;
@Override
public void init(ServletConfig config) throws ServletException {
this.config = config;
//调用init()方法
init();
}
public void init(){
}
@Override
public ServletConfig getServletConfig() {
return this.config;
}
@Override
public abstract void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException ;
@Override
public String getServletInfo() {
return "我是一个漂亮的Servlet";
}
@Override
public void destroy() {
}
@Override
public String getServletName() {
return this.getServletConfig().getServletName();
}
@Override
public ServletContext getServletContext() {
return this.getServletConfig().getServletContext();
}
@Override
public String getInitParameter(String name) {
return this.getServletConfig().getInitParameter(name);
}
@Override
public Enumeration getInitParameterNames() {
return this.getServletConfig().getInitParameterNames();
}
}
//=====================================
//写一个servlet去继承刚才自己写的MyGenericServlet
public class CServlet extends MyGenericServlet {
@Override
public void init() {
System.out.println("我是CServlet的初始化操作!!");
}
@Override
public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException {
//获取phone的值
String phone = getInitParameter("phone");
System.out.println("phone = "+phone);
System.out.println("Hello Servlet");
res.getWriter().print("Hello");
}
}
//================================
web.xml
<servlet>
<servlet-name>CServlet</servlet-name>
<servlet-class>
com.atguigu.servlet.CServlet</servlet-class>
<init-param>
<param-name>phone</param-name>
<param-value>138888888</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>CServlet</servlet-name>
<url-pattern>/CServlet</url-pattern>
</servlet-mapping>
//===================================
=================================
HttpServlet
/**
创建一个Servlet有三种方式
实现Servlet接口
继承GenericServlet抽象类
继承HttpServlet抽象类
当通过继承HttpServlet创建一个Servlet时,只需要根据要处理的请求的不同去重写不同的方法:
如果要处理get请求,则重写doGet方法
如果要处理post请求,则重写doPost方法
*/
public class DServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//doGet会在接收get请求时调用
System.out.println("doGet");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//doPost会在接收post请求时调用
System.out.println("doPost");
}
}
===========================
HttpServletRequest:重点
/**
代表:代表浏览器发送给服务器的请求报文
获取:该对象由服务器创建,最终作为参数传递到doGet或doPost方法中
功能4个:
--可以获取用户发送的请求参数
String getParamter(String name)
--可以获取项目名(主要用来设置绝对路径)
String getContextPath()
--可以作为一个域对象在不同的web资源之间共享数据。
--请求的转发
request.getRequestDispatcher(路径).forward(request,response);
*/
=========================
HttpServletResponse:重点
/**
代表:服务器发送给浏览器的响应报文
获取:该对象由服务器创建,最终作为参数传递到doGet或doPost方法中
功能2个:
--向浏览器发送一个页面或页面片段
response.getWriter().print();
--请求的重定向
response.sendRedirect(路径);
*/
===========================
转发和重定向:
/**
转发和重定向比较:
转发(request) 重定向(response)
浏览器发送的请求次数 1次 2次
发生的位置 服务器 浏览器
地址栏的改变 不变 改变
浏览器是否感知 不知道 知道
*/
============================
HttpServletRequest和HttpServletResponse代码测试:
1、建servlet继承自HttpServlet
2、配置web.xml
3、访问地址路径:http://localhost:8080/项目名/映射URL
/**
转发和重定向比较:
转发(request) 重定向(response)
浏览器发送的请求次数 1次 2次
发生的位置 服务器 浏览器
地址栏的改变 不变 改变
浏览器是否感知 不知道 知道
*/
public class HServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/**
* 请求首行
* 请求头
* 空行
* 请求体
*
*
* HttpServletRequest
* 代表:浏览器发送给服务器的请求报文
* 获取:该对象由Tomcat服务器创建,最终作为参数传递给doGet或doPost方法
* 功能:
* 【1】获取请求参数
* 【2】可以获取项目名
* 【3】可以作为一个域对象在不同的web资源之间共享数据(request servletContext)
* 【4】可以做请求的转发
*/
//获取请求参数
/*
String username = request.getParameter("username");
String password = request.getParameter("password");
//在页面中输出用户名
response.getWriter().print("<h1>username = "+username+"</h1>");
System.out.println(password);*/
//获取项目名
//这个方法主要用来设置绝对路径
/*
String contextPath = request.getContextPath();
System.out.println(contextPath);
*/
//请求的转发
/**
* 所谓的转发就是servlet收到浏览器发送的请求以后,
* 当前servlet不去处理请求,
* 而是去调用服务器内部的其他资源去处理请求。
* 转发的特点:
* 转发时浏览器发送了1次请求
* 转发是在服务器内部进行的
* 浏览器的地址栏不会发生改变
* 浏览器不知道转发的发生
*
*/
//1.获取一个请求的派发器
RequestDispatcher dispatcher = request.getRequestDispatcher("target.html");
//2.通过dispatcher发起转发操作
dispatcher.forward(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/**
* 响应首行
* 响应头
* 空行
* 响应体
*
*
* HttpServletResponse
* 代表:代表服务器发送给浏览器的响应报文
* 获取:该对象由服务器创建,最终作为参数传递到doGet或doPost方法中,我们可以在这两个方法中直接使用
* 功能:
* 【1】向浏览器输出一个页面或者是页面片段
* 【2】可以发起请求的重定向
*
*/
//【1】向浏览器输出一个页面或者是页面片段
//response.getWriter().print("");
//获取一个字符输出流
PrintWriter out = response.getWriter();
//通过流向浏览器响应一段信息
out.print("<h1>Hello</h1>");
//【2】可以发起请求的重定向
/**
* 重定向指的是当服务器收到一个请求后,返回给浏览器一个特殊的响应
* 这个特殊的响应告诉浏览器再去向另一个地址发送请求。
*
* HTTP/1.1 302 Found
Location: http://localhost:8080/08_WEB_Servlet/target.html
这个特殊的响应的响应状态码是302,还有一个特殊的头Location,Location指向一个新的地址
当浏览器收到302这个响应状态码,他会想Location头所指向的地址再次发送请求
重定向的特点:
重定向时浏览器发送了2次请求
重定向是发生浏览器端
重定向时浏览器的地址栏发生改变
浏览器可以感知重定向的发生
*/
response.sendRedirect("target.html");
}
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<servlet>
<servlet-name>HServlet</servlet-name>
<servlet-class>com.atguigu.servlet.HServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HServlet</servlet-name>
<url-pattern>/HServlet</url-pattern>
</servlet-mapping>
</web-app>
============================
tips:新建servlet的快捷方式
/**
window--Customize Perspective--Shortcus--Web--Servlet
*/
===============================
tips:隐藏项目的快捷方式:
选中项目–右键–Close Projects
接着选中Filtrs–Close Projects
那如果要打开隐藏的项目呢。
选择Project–Open Project
==================================
未完待续!
更多推荐
所有评论(0)