servlet
它是运行在web服务器端的一个java小程序
Servlet它是一个资源,用来被用户访问的资源,同时也是一个动态资源
Servlet的作用:它是基于Http协议,主要用来接收客户端发送的请求,处理请求,报数据响应给客户端
实现servlet程序
1 .实现servlet接口
2. 实现service方法( service方法专门处理请求并响应数据 )只要有请求就会用到这个方法
3.到web.xml 中去配置servlet程序的访问地址
public class Servlet extends HttpServlet {
@Override
//只要有请求就会用到这个方法
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
super.service(req, res);
System.out.println("services methods...");
}
}
<!--给servlet标签配置servlet程序-->
<servlet>
<!--给servlet程序起一个别名(一般是类名)-->
<servlet-name>hello</servlet-name>
<!--servlet程序的全类名地址 类包下的路径-->
<servlet-class>TestServlet.helloservlet</servlet-class>
</servlet>
<!--给servlet程序的配置访问地址-->
<servlet-mapping>
<!--告诉服务器当前配置的地址是给哪个servlet程序使用(一般和别名一致)-->
<servlet-name>hello</servlet-name>
<!--配置访问地址
/ 斜杠在服务器解析的时候 表示为:http://ip:port/工程路径
/hello 表示地址为:http://ip:port/工程路径/hello 即资源路径
-->
<url-pattern>/hello</url-pattern>
</servlet-mapping>
注:相当于注解 @WebServlet("/hello")
servlet的生命周期
执行servlet构造器方法,执行init初始化方法,执行service方法,执行destory方法
Servlet的接口和实现类:
servlet是一个接口
Genericservlet 它是一个类,实现了servlet接口
Httpservlet 它是一个类,继承Genericservlet
请求分发处理
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println(" service被访问了");
// 类型转换(因为它有getMethod()方法)
HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
// 获取请求的方式
String method = httpServletRequest.getMethod();
if ("GET".equals(method)) {
doGet();
} else if ("POST".equals(method)) {
doPost();
}
}
一般开发中,创建servlet,通常去继承httpservlet
1 重写doGET或doPOST方法
2 到web.xml中的配置servlet程序访问地址
注:httpservlet中的service方法已经封装好了请求分发处理 只需要调用方法就行了
ServletConfig类
servlet程序的配置信息类。用于做初始化
作用:
1 可以获取servlet 程序的别名 servlet-name 的值
2 可以获取初始化参数 init-param
3 获取 servletContext 对象
servlet程序默认是第一次访问的时候创建,ServletConfig是每个servlet程序创建时,就创建一个对应的ServletConfig对象。
//web.xml 配置文件
<servlet>
<servlet-name>helloServlet</servlet-name>
<servlet-class>servletTest.Servlet</servlet-class>
<init-param>
<param-name>username</param-name>
<param-value>H</param-value>
</init-param>
<init-param>
<param-name>root</param-name>
<param-value>abc123</param-value>
</init-param>
</servlet>
//用于做初始化使用
public class Servlet extends HttpServlet {
@Override
public void init(ServletConfig config) throws ServletException {
//获取别名
System.out.println(config.getServletName());
//获取初始化参数
System.out.println(config.getInitParameter("username"));
System.out.println(config.getInitParameter("root"));
//获取servletContext对象
System.out.println(config.getServletContext());
}
}
ServletContext类
ServletContext是一个接口,表示servlet上下文对象。
一个web工程,只有一个ServletContext对象实例。
ServletContext对象是一个域对象。
ServletContext是在web工程部署启动的时候创建,工程停止时销毁
作用:
1 获取web.xml 中配置的上下文参数 context-param
2 获取当前的工程路径
3 获取工程部署后在服务器硬盘上的绝对路径
4 像Map一样存取数据
域对象
可以像Map一样存取数据的对象。域指的是存取数据的操作范围
方法 setAttribute,getAttribute,removeAttribute
//web.xml配置文件
//context-param 是上下文参数(它属于整个web工程)
<context-param>
<param-name>user</param-name>
<param-value>H</param-value>
</context-param>
//ServletContext作用:
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1 获取web.xml 中配置的上下文参数 context-param
ServletContext context=getServletContext();
System.out.println(context); //一个web工程,只有一个ServletContext对象实例
System.out.println(context.getInitParameter("user"));
//2 获取当前的工程路径
System.out.println("工程路径 "+context.getContextPath());
//3 获取工程部署后在服务器硬盘上的绝对路径
// "/"斜杠被服务器解析地址为:http://ip:port/工程名/ 映射到IDEA代码的web目录
System.out.println("绝对路径 "+context.getRealPath("/"));
System.out.println("工程下文件的绝对路径 "+context.getRealPath("/a.html"));
//4 像Map一样存取数据
context.setAttribute("key1","value1");
context.setAttribute("key2","value2");
context.setAttribute("key3","value3");
System.out.println(context.getAttribute("key1"));
System.out.println(context.getAttribute("key2"));
System.out.println(context.getAttribute("key3"));
}
HttpServletRequest类
每次有请求进入Tomcat服务器,服务器就会把请求过来的HTTP协议信息解析封装好到Reuqest对象中。然后传递到Service方法中供我们使用。通过HttpServletRequest对象,获取到所有请求的信息
**
//常用方法
public class RequestServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
request.setCharacterEncoding("utf-8"); //解决post请求获取参数时的乱码问题
//获取资源路径
System.out.println("url--"+req.getRequestURI());
//获取绝对路径
System.out.println("url--"+req.getRequestURL());
//获取客户端ip地址
System.out.println("ip--"+req.getRemoteHost());
//获取请求头
System.out.println("user_agent--"+req.getHeader("user-agent"));
//获取请求方式
System.out.println("请求方式"+req.getMethod());
//获取请求参数
String username = req.getParameter("username");
System.out.println("用户名"+username);
String pwd = req.getParameter("pwd");
System.out.println("密码"+pwd);
String[] hob=req.getParameterValues("hob");
System.out.println("爱好"+Arrays.asList(hob));
}
}
请求转发
服务器收到请求后,从一次资源跳转到另一个资源的操作
特点:
浏览器地址无变化;
它们是一次请求;它们共享Request域中的数据;
可以转发到WEB-INF目录下;不能访问工程外的资源
public class servlet1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username = req.getParameter("username");
System.out.println("在s1中查看参数"+username);
//加一个值作为标识
req.setAttribute("key1","s1");
//转发的地点 以 / 开头 映射到web目录
RequestDispatcher requestDispatcher = req.getRequestDispatcher("/servlet2");
//转发
requestDispatcher.forward(req,resp);
}
}
public class servlet2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username = req.getParameter("username");
System.out.println("在s2中查看参数"+username);
//查看标识
Object key1 = req.getAttribute("key1");
System.out.println("s1是否有标识"+key1);
//处理自己业务
System.out.println("处理自己业务");
}
}
base标签
可以设置当前页面中所有相对路径工作时,参照哪个路径进行跳转。
<head>
<base href="src...">
</head>
web中 / 的不同意义
在web中 / 是一种绝对路径
/ 被浏览器解析,得到的地址是 http://ip:port
/ 被服务器解析,得到的地址是http://ip:port/工程路径
HttpServletResponse类
每次有请求进入Tomcat服务器,服务器就会创建一个Response对象传递给servlet程序去使用。HttpServletResponse 表示所有响应的信息
public class helloservlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置服务器字符集
resp.setCharacterEncoding("utf-8");
//同时设置服务器和客户端都使用utf-8字符集 要在获取流对象之前才有效 法一
//resp.setContentType("text/html; charset=utf-8");
//通过响应头 设置浏览器也使用UTF-8字符集 解决响应乱码问题 法二
resp.setHeader("content-type","text/html;charset=utf-8");
//往客户端回传数据
PrintWriter writer = resp.getWriter();
writer.write("不是语句");
}
}
请求重定向
客户端给服务端发送请求,提供一个新的地址去访问。
特点:
浏览器地址栏变化;
发起了两次请求;不共享Request域中的数据;
不能访问WEB-INF下的资源;可以访问工程外的资源
//法一
public class servlet1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("s1到此一游");
//设置响应码 表示重定向
resp.setStatus(302);
//设置响应头 说明新的地址
resp.setHeader("location","http://localhost:8080/Tservlet/servlet2");
//resp.setHeader("location","https://www.baidu.com/"); 重定向到工程外的资源
}
}
public class servlet2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().write("r2");
}
}
//法2 推荐使用
public class servlet1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("s1到此一游");
resp.sendRedirect("https://www.baidu.com/");
}
}