初见Servlet
作者:互联网
Servlet 初始化+导包
- 创建Maven项目选择"Create from archetype"(骨架)
- 选择骨架"maven-archetype-webapp"
- 增加依赖并确保原依赖是最新版本
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
-
src/main目录下自动补齐两个文件夹"java"&"resources"
-
新建逻辑类并实现Servlet接口 重写接口的所有方法
-
逻辑类增加注解(默认端口号下的后续路径)
@WebServlet("/path")
-
增加plugin"tomcat7" 整合tomcat到idea上
<plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.2</version> </plugin>
-
tomcat7:run
-
在浏览器中访问http://localhost:8080/tomcat3/path
-
Init()与service()被触发
Request & Response
- Request:获取请求数据(用户名、密码....)
- Response:设置响应数据
RequestFacade(Tomcat定义的实现类)—>HttpServletRequest(对http协议封装的Request接口) —> ServletRequest
//*****************Request的一些方法*****************
@WebServlet("/test")
public class RequestDemo1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//String getMethod() 获取请求方式
String method = req.getMethod();
System.out.println(method);
//String getContextPath = req.getContextPath() 获取虚拟目录(项目访问路径)
String contextPath = req.getContextPath();
System.out.println(contextPath);
//StringBuffer getRequestURL() 获取URL(统一资源定位符)
StringBuffer url = req.getRequestURL();
System.out.println(url.toString());
//String getQueryString() 获取请求参数(GET方式) username = user1
String queryString = req.getQueryString();
System.out.println(queryString);
//________________________________________________________________
//获取请求头:user-agent 浏览器的版本信息
String agent = req.getHeader("user-agent");
System.out.println(agent);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取post请求体:请求参数
//1.获取字符输入流
BufferedReader br = req.getReader();
//2.读取数据
String line = br.readLine();
System.out.println(line);
}
}
-
请求参数获取方式
- GET方式 doGet() :
String getQueryString();
- POST方式 doPost() :
BufferedReader getReader();
-
通用方式获取请求参数
Map<String,String[]> getParameterMap();//获取所有参数Map集合
String[] getParameterValues(String name);//根据名称获取参数值/数组
String getParameter(String name)//根据名称获取参数值(单个)
-
请求转发:一种在服务器内部的资源跳转方式
写法
//in ResourceA
req.getRequestDispatcher("/Path of resourceB").forward(req,resp);
Response响应数据
- 响应行
void setStatus(int sc);//设置响应状态码 ** HTTP/1.1 200 OK
- 响应头
void setHeader(String name,String value);//设置响应头键值对 ** Content-Type:text/html
- 响应体
PrintWritter getWriter();//获取字符输出流
ServletOutputStream getOutputStream();//获取字节输出流
//** <html><head></head><body></body></html>
Response-响应字符/字节数据:
PrintWriter writer = resp.getWriter();//字符数据
writer.write("text here.");
//还可以用html格式输出 使用:
resp.setHeader("content-type","text/html");或resp.setContentType("text/html;charset=utf-8");//中文
writer.write("<h1>Hello</h1>");
//1.通过Response对象获取字节输出流
ServletOutputStream os = resp.getOutputStram();
//2.写数据
os.write(字节数据);
- IOUtils工具类
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.11.0</version>
</dependency>
IOUtils.copy(fis,os);
重定向
resp.setStatus(302);// 提供状态码
resp.setHeader("location","/resourceB path");// 提供重定向路径
重定向与请求转发的区别(Redirect || Forward):
一句话,转发是服务器行为,重定向是客户端行为。
转发过程:客户浏览器发送http请求----》web服务器接受此请求–》调用内部的一个方法在容器内部完成请求处理和转发动作----》将目标资源发送给客户;在这里,转发的路径必须是同一个web容器下的url,其不能转向到其他的web路径上去,中间传递的是自己的容器内的request。在客户浏览器路径栏显示的仍然是其第一次访问的路径,也就是说客户是感觉不到服务器做了转发的。转发行为是浏览器只做了一次访问请求。
重定向过程:客户浏览器发送http请求----》web服务器接受后发送302状态码响应及对应新的location给客户浏览器–》客户浏览器发现是302响应,则自动再发送一个新的http请求,请求url是新的location地址----》服务器根据此请求寻找资源并发送给客户。在这里 location可以重定向到任意URL,既然是浏览器重新发出了请求,则就没有什么request传递的概念了。在客户浏览器路径栏显示的是其重定向的路径,客户可以观察到地址的变化的。重定向行为是浏览器做了至少两次的访问请求的。
标签:浏览器,String,resp,req,获取,初见,Servlet,请求 来源: https://www.cnblogs.com/icexqw/p/15986585.html