Servlet技术
什么是servlet
①servlet是javaee规范之一,规范就是接口 ②servlet是javaweb三大组件之一。三大组件分别是:servlet程序,Filter过滤器,listener监听器 ③servlet是运行在服务器上的一个java小程序,它可以接受客户端发送过来的请求,并相应数据给客户端
手动实现servlet程序
①编写一个类去实现servlet接口 ②实现service方法,处理请求,并响应程序 ③到web.xml中去配置servlet程序的访问地址
url地址定位到服务器
Servlet的生命周期
①执行Servlet构造器方法 ②执行int初始化方法 第一、二步是在第一次访问的时候创建servlet ③执行service方法 第三步,每次访问都会调用 ④执行destroy销毁方法 第四步,在web工程停止的时候调用
GET和POST请求的分发处理
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
String method = httpServletRequest.getMethod();
System.out.println(method);
}
通过继承HttpServlet实现Servlet程序
一般在实际项目开发中,都是使用继承HttpServlet类的方式去实现Servlet程序 ①编写一个类去继承HTTPServlet类 ②根据业务需要重写doGet或doPost方法 ③到web.xml中配置servlet程序的访问地址 servlet类
public class helloServlet2 extends HttpServlet {
public helloServlet2() {
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("helloServler2 的doGet方法");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("helloServler2 的doPost方法");
}
}
xml配置
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>com.servlet.helloServlet2</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/hello2</url-pattern>
</servlet-mapping>
使用IDEA创建servlet程序
Servlet类的继承体系
ServletConfig类
Servlet程序的配置信息类 Servlet程序和ServletConfig对象都是由Tomcat负责创建,我们负责使用。 Servlet程序默认第一次访问的时候创建,ServletConfig是每个程序创建时,就创建一个对应的ServletConfig对象
ServletConfig类的三大所用
①可以获取Servlet程序的别名servlet-name的值 ②获取初始化参数init-param ③获取ServletContext对象 web.xml配置
<init-param>
<param-name>username</param-name>
<param-value>root</param-value>
</init-param>
servlet类
System.out.println("helloServlet程序的别名是:"+servletConfig.getServletName());
System.out.println("初始化参数uesename的参数值:"+ servletConfig.getInitParameter("username"));
System.out.println(servletConfig.getServletContext());
注意:重写init方法一定要调用父类的init(ServletConfig)操作
@Override
public void init(ServletConfig config) throws ServletException{
super.init(config);
System.out.println("重写init初始化方法");
}
ServletContext类
什么是ServletContext接口
①ServletContext是一个接口,它表示Serv上下文对象 ②一个web工程只有一个ServContext对象实例 ③ServletContext对象是一个域对象(域对象是可以像Map一样存储数据的对象,“域”指的是存取数据的操作范围)
| 存数据 | 取数据 | 删除数据 |
---|
Map | put() | get() | remove() | 域对象 | setAttribute() | getAttribute() | removeAttribute() |
ServletContext类的作用
①获取web.xml中配置的上下文参数context-param ②获取当前的工程路径,格式:/工程路径 ③获取工程部署后在服务器硬盘上的绝对路径 ④像Map一样存取数据
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ServletContext context = getServletConfig().getServletContext();
String username = context.getInitParameter("username");
System.out.println("context-param参数username的值是:"+username);
System.out.println("context-param参数password的值是:"+context.getInitParameter("password"));
System.out.println("当前工程路径:" + context.getContextPath());
System.out.println("工程部署的路径是:" + context.getRealPath("/"));
}
contextServlet1
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ServletContext context = getServletContext();
context.setAttribute("key1","value1");
System.out.println("context中获取域数据key1的值是:" + context.getAttribute("key1"));
}
contextServlet2
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ServletContext context = getServletContext();
System.out.println("context2 中获取域数据key1的值是:" + context.getAttribute("key1"));
}
结果:第一次运行contextServlet2时,未给key1设定值,所以结果为null;运行contextServlet1后,给key1设定了值,再次运行发现contextServlet2中获取到了key1的值,说明context是可以在module中任意调用的。
HttpServletResponse
Web服务器接收到客户端的http请求,会针对这个请求分别创建一个代表请求的HttpServletRequest对象,代表响应的一个HttpServletResponse对象。 获取客户端请求过来的参数,找HttpServletRequest 给客户端响应一些信息:找HttpServletResponse
简单分类
负责向浏览器发送数据的方法
servletOutStream getOutputStream() throws IOException;
PrintWriter getWriter() throws IOException;
负责向浏览器发送响应头的方法
void setCharacterEncoding(String var1);
void setContentLength(int var1);
void setContentLengthLong(long var1);
void setContentType(String var1);
负责向浏览器发送响应头的方法
Void setCharacterEncoding(String var)
Void setContentLength(int var1)
Void setCointentLengthLong(long val)
Void setContentType(Stirng var1)
Void setDateHeader(String var1,long var2)
Void addDateHeader(String var1,long var2)
Void setHeader(String var1,String var2)
Void addHeader(String var1,String var2)
Void setIntHeader(String var1,int var2)
Void addIntHeader(String var1,int var2)
常见应用
向浏览器输出信息
下载文件
a.获取下载文件的路径 b.下载的文件名 c.设置浏览器能够支持下载的东西 d.获取下载文件的输入流 e.创建缓冲区 f.获取OutputStream g.将FileOuputStream流写入到buffer缓冲区 h.使用OutputStream将缓冲区总的数据输出到客户端
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String realPath = "D:\\javawebstudy\\servletStudy\\servletDemo\\src\\main\\resources/background.JPG";
System.out.println("下载文件的路径:"+realPath);
String fileName = realPath.substring(realPath.lastIndexOf("//")+1);
resp.setHeader("Content-Disposition","attachment;filename="+fileName);
FileInputStream in = new FileInputStream(realPath);
int len = 0;
byte[] buffer = new byte[1024];
ServletOutputStream out = resp.getOutputStream();
while(in.read(buffer) > 0){
out.write(buffer,0,len);
}
in.close();
out.close();
}
验证码功能
后端实现:java的图片类,生成一个图片
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setHeader("refresh","3");
BufferedImage image = new BufferedImage(80,20,BufferedImage.TYPE_INT_RGB);
Graphics2D g = (Graphics2D) image.getGraphics();
g.setColor(Color.white);
g.fillRect(0,0,80,20);
g.setColor(Color.BLUE);
g.setFont(new Font(null,Font.BOLD,20));
g.drawString(makeNum(),0,20);
resp.setContentType("image/jpeg");
resp.setDateHeader("expires",-1);
resp.setHeader("Cache-Control","no-cache");
resp.setHeader("Pragma","no-Cache");
ImageIO.write(image,"jpg",resp.getOutputStream());
}
private String makeNum(){
Random random = new Random();
String num = random.nextInt(9999999)+"";
StringBuffer sb = new StringBuffer();
for(int i = 0; i < 7-num.length(); i++){
sb.append("0");
}
String s = sb.toString()+num;
num = sb.toString()+num;
return num;
}
response重定向
一个web资源收到客户端请求后,他会通知客户端去访问另外一个web资源C,这个过程叫做重定向 常见场景:用户登录
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.sendRedirect("/servletDemo_war_exploded/img");
}
重定向和转发的区别: 相同点:页面都会实现跳转 不同点:①请求转发的时候,url不会产生变化②重定向的时候,url地址栏会发生变化
测试 .jsp
<%--这里提交的路径,需要寻找到项目的路径--%>
<%--${pageContext.request.contextPath} 代表当前项目--%>
<form action="${pageContext.request.contextPath}/request" method="get">
用户名:<input type="text" name="username"><br>
密码:<input type="password" name="password"><br>
<input type="submit">
</form>
.java
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username = req.getParameter("username");
String password = req.getParameter("password");
System.out.println(username + ":" + password);
resp.sendRedirect("/servletDemo_war_exploded/success.jsp");
}
HttpServletRequest
HttpServletRequest代表客户端的请求,用户通过Http协议访问服务器,HTTP请求中的所有信息会被封装到HttpServletRequest,通过这个HttpServletRequest的方法,获得客户端的所有信息。
获取前端传递的参数,请求转发
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
resp.setCharacterEncoding("UTF-8");
String username = req.getParameter("username");
String password = req.getParameter("password");
String[] hobby = req.getParameterValues("hobbies");
System.out.println("====================");
System.out.println(username);
System.out.println(password);
System.out.println(Arrays.toString(hobby));
System.out.println("====================");
req.getRequestDispatcher("/success.jsp").forward(req,resp);
}
|