0x00前言
Servlet就是一个接口我们需要写一个类然后去实现Servlet,就可以被服务器识别到。request是用来接受客户端传过来的参数,respone是用来响应客户端的页面。我们所用的容器是一个继承的java容器tomcat。
0x01Servlet快速入门
0x1需要去实现接口Servlet接口实现方法
init方法Servlet创建的时候就会执行
Service方法每次Servlet被访问的时候就会执行
destroy方法每次服务器正常结束的时候就会执行,一般用于输出一些关于Servlet作者的信息
package webdemo1;
import javax.servlet.*;
import java.io.IOException;
public class Servletdemo2 implements Servlet {
public Servletdemo2() {
super();
}
@Override
public void init(ServletConfig servletConfig) throws ServletException {
//被创建的时候会会执行一次1
System.out.println(\"init执行了\");
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
//每次访问service访问的时候会被执行类似于固定代码块stati在类加载的时候也是,访问异常Servlet就会被执行一次
System.out.println(\"service 执行了\");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
//销毁方法,在服务器正常结束的时候执行一次
System.out.println(\"destroy执行了\");
}
}
0x2配置Servlet服务
需要在web.xml里面配置Servlet服务
<servlet>
<servlet-name>demo1</servlet-name>
<servlet-class>webdemo1.Servletdemo1</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>demo1</servlet-name>
<url-pattern>/demo1</url-pattern>
</servlet-mapping>
```,
但是如果Servlet多了以后配置文件会很复杂,3.0以后可以通过注解配置
`@WebServlet(urlPatterns = \"/demo3\")`这样配置直接访问。
####0x3Servlet的继承的关系
`public class Servletdemo4 extends GenericServlet`它把interface Servlet的方法都给实现了只留下了一个service是抽象方法。
`public abstract class HttpServlet extends GenericServlet`
`HttpServlet`是一个抽象类,它是去接受访问到的数据的我们平时用到的是doget和dopost对应两个提交方式做不同的处理
0x02request
0x1继承关系
ServletRequest --接口
丨继承
HttpServlet --接口
丨实现
org.apache.catalina.connector.RequestFacade 类(tomcat)
0x2Request
**GET**
String getMethod() 获取请求方式
String getContextPath() 获取虚拟目录
String gerQueryString() 获取参数
String getRequestURL()获取请求URL/demo1
StringBuffer getRequestURL()http://127.0.0.1/demo1
String getProtocol() 获取协议和版本
String getRemoteAddr() 获取目标可客户机的IP
String getHeader() 获取请求头
Enumeration<String> getHeaderNames 获取请求头名称
**通用形的获取参数**
String getParameter()获取请求参数
String[] parameterValues = request.getParameterValues(\"username\");
for (String s:parameterValues) {
System.out.println(s)}根据参数名获取一个参数值的数组
Map<String, String[]> parameterMap = request.getParameterMap();//获取所有map集合
Map<String, String[]> parameterMap = request.getParameterMap();
Set<String> strings = parameterMap.keySet();
for (String name:strings
) {
String[] strings1 = parameterMap.get(name);
for (String value:strings1
) {
System.out.println(value);
}
}
0x02资源转发和数据共享
0x1转发的方法
1.通过request对象获取请求转发器对象:RequestDispatcher getRequestDispatcher(String path)
2.使用RequestDispatcher对象来进行转发:forward(ServletRequest request, ServletResponse response)
@WebServlet(name = \"Servletdemo9\", value = \"/Servletdemo9\")
public class Servletdemo9 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println(\"demmo9被访问了\");
RequestDispatcher requestRequestDispatcher = request.getRequestDispatcher(\"Servletdemo10\");
requestRequestDispatcher.forward(request,response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request,response);
}
}
@WebServlet(name = \"Servletdemo10\", value = \"/Servletdemo10\")
public class Servletdemo10 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println(\"demmo10被访问了\");
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request,response);
}
}
返回的结果是demmo9被访问了,demmo10被访问了
0x2转发的特点
1.浏览器的路径不会发生变化
2.只能访问服务器内部的资源
3.使用的是同一次请求
0x3共享数据
1.域对象:一个有作用范围的对象,可以在范围内共享数据。
2.request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据
3.方法
void setAttribute(String name,Object obj):存储数据
Object getAttitude(String name):通过键获取值
void removeAttribute(String name):通过键移除键值对
4.演示
demo9去存放数据
System.out.println(\"demmo9被访问了\");
request.setAttribute(\"msg\",\"hellow\");//键值对的方式存数据
RequestDispatcher requestRequestDispatcher = request.getRequestDispatcher(\"Servletdemo10\");
requestRequestDispatcher.forward(request,response);
demo10去访问数据
System.out.println(\"demmo10被访问了\");
Object msg = request.getAttribute(\"msg\");
System.out.println(msg);
0x03response
0x1状态码
1xx:服务器收到客户端消息,但是没有接受完成,等待一段时间后,发送1xx多状态码,催促继续发送
2xx:代表成功,200
3xx:重定向,代表:302(重定向)304(访问缓存)
4xx:客户端错误。代表:404(路径没有对应的资源)405请求方式没有对应doxxx的方法
5xx:服务端错误 服务器代码有错
0x2重要的响应头
Content-Type:服务器告诉客户端本次响应体的数据格式和编码格式
0x3设置response
1.设置响应行:setStatus(int sc)
2.设置响应头setHeader(String name,String value)
3.设置响应体
(1)获取输出流:字符输出流PrintWriter getWriter
(2)字节输出流:ServletOutputStream getOutputStream
4.路径设置
String contextPath = request.getContextPath();
response.sendRedirect(contextPath+\"Servletdemo11\");//这样拼接路径以后好更改
0x4重定向的使用
重定向:
- 地址栏发生变化
- 重定向可以访问其他站点(服务器)的资源
- 重定向是两次请求。不能使用request对象来共享数据
转发: - 转发地址栏路径不变
- 转发只能访问当前服务器下的资源
- 转发是一次请求,可以使用request对象来共享数据
代码:
@WebServlet(name = \"Servletdemo11\", value = \"/Servletdemo11\")
public class Servletdemo11 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// **1xx**:服务器收到客户端消息,但是没有接受完成,等待一段时间后,发送1xx多状态码,催促继续发送
// **2xx**:代表成功,200
// **3xx**:重定向,代表:302(重定向)304(访问缓存)
//**4xx**:客户端错误。代表:404(路径没有对应的资源)405请求方式没有对应doxxx的方法
// **5xx**:服务端错误 服务器代码有错
this.doPost(request,response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//Servletdemo11会自动访问Servletdemo12
System.out.println(\"demo被访问了\");
response.setStatus(302);
response.setHeader(\"location\",\"Servletdemo12\");
}
}
demo2
重定向的方法response.sendRedirect(\"Servletdemo13\");
@WebServlet(name = \"Servletdemo12\", value = \"/Servletdemo12\")
public class Servletdemo12 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println(\"Servletdemo12被访问了\");
response.getWriter().write(\"我的访问撒过了\");
response.sendRedirect(\"Servletdemo13\");
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
}
0x5write
@WebServlet(\"/response\")
public class Response extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setCharacterEncoding(\"gbk\"); //设置编码
PrintWriter writer = resp.getWriter(); //获取输出对象
writer.write(\"response\");//输出内容
writer.println(\"1235\");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
输出字节流:
ServletOutputStream outputStream = resp.getOutputStream();
outputStream.write(\"abc\".getBytes());
0x05ServletContext使用
1.概念:代表整个web应用,可以和程序的容器(服务器)来通信
2.获取
(1)通过request.getServletContext()
(2)通过HttpServletthis.getServletContext()
3.功能
(1)获取MIME:在互联网通信过程中定义的一种文件数据类型
格式:大类型/小类型 text/html image/jpeg
(2)域对象:共享数据
(3)获取文件的真实(服务器)路径
request.getServletContext(); : 通过request对象获取
this.getServletContext(); : 通过HttpServlet获取
String getMimeType(String file) : 获取MIME对象
域对象:共享数据
1. setAttribute(String name,Object value)
2. getAttribute(String name)
3. removeAttribute(String name)
获取文件的真实(服务器)路径:
String getRealPath(String path)
简单的一个超链接下载案例
<!DOCTYPE html>
<html lang=\"en\">
<head>
<meta charset=\"UTF-8\">
<title>Title</title>
</head>
<body>
<a href=\"puuture/cat.jpg\">图片1查看</a>
<a href=\"puuture/cat2.jpg\">图片2查看</a>
<hr>
<a href=\"Servletdownload?filename=cat.jpg\">图片1下载</a>
<a href=\"Servletdownload?filename=cat2.jpg\">图片2下载</a>
</body>
</html>
看一下Servlet
@WebServlet(name = \"Servletdownload\", value = \"/Servletdownload\")
public class Servletdownload extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String filename = request.getParameter(\"filename\"); //接收filename传参的值
ServletContext servletContext = this.getServletContext(); //创建servletContext 对象
String Path = servletContext.getRealPath(\"/puuture/\" + filename); //获取文件真实路径
String mimeType = servletContext.getMimeType(filename);//获取mimel类型
FileInputStream fis = new FileInputStream(Path); //路径参数文件输入流对象中
response.setHeader(\"content-type\",mimeType); //响应头设置mime类型
response.setHeader(\"content-disposition\",\"attachment;filename=\"+filename); //设置为附件类型
ServletOutputStream outputStream = response.getOutputStream(); //获取文件输出流
byte[] buff = new byte[1024]; //设置每次读取的字节大小
int len =0;
while ((len = fis.read(buff))!=-1){
outputStream.write(buff,0,len);
}
}
}
0x06总结和归纳
总的来说Servlet(request和response)+Jdbc可以组成简单的后端基础处理了。仔细看最后一个案例可以学到很多东西。
来源:https://www.cnblogs.com/0x3e-time/p/16226896.html
本站部分图文来源于网络,如有侵权请联系删除。