JavaWeb中Servlet的深入讲解

网友投稿 237 2023-01-23

JavaWeb中Servlet的深入讲解

Servlet

1 Servlet 简介

Servlet就是Sun 公司开发动态web的一门技术

Sun在这些API中提供一个接口叫做:Servlet ,如果你向开发一个Servlet程序,只需要完成两个小步骤

编写一个类,实现Servlet接口

把开发好的java类部署到web服务器中

把实现Servlet接口的Java程序叫做 Servlet

2 HelloServlet

构建一个普通的Maven项目,删除里面的src目录。这个空的工程就是Maven主工程

关于Maven父子工程的理解:

父项目中会有

servlet-02

子项目中会有

javaweb-02-servlet

com.srx

1.0-SNAPSHOT

父项目中的Java子项目可以直接使用

son extends father

Maven环境优化

修改web.xmd为最新的

将maven的结构搭建完整

编写一个Servlet程序

编写Servlet的映射

为什么需要映射,我们系的是java程序,但是要通过浏览器访问,而浏览器需要连接web服务器,所以我们需要再web服务中注册我们写的Servlet 还需要给他一个浏览器 能够访问的路径

hello

com.srx.HellowServlet

hello

hello

配置Tomcat

注意:配置项目发布的路径就可以了

启动测试 欧克

3 Servlet 原理

servlet 是由web服务器调用,wev服务器在收到浏览器请求之后 会:

4 Mapping 问题

一个Servlet 可以指定一个映射路径

一个Servlet 可以指定多个映射路径

hello

/hello

hello

/hello1

hello

/hello2

hello

/hello3

一个Servlet 可以指定通用映射路径

hello

/hello/*

默认请求路径

hello

/*

指定一些后缀或者前缀等等…

hello

*.abc

优先级问题

指定了固有的映射路径优先级最高,如果找不到就会走默认的处理请求;

error

com.srx.Error

error

/*

5 servletContext

web容器在启动的时候,它会为每个web程序都创建一个对应的ServletContext 对象,它代表了当前web应用。

1.共享数据

我在这个Servlet中保存的数据,可以在另外一个servlet中拿到

存放数据的类

public class test extends HttpServlet {

@Override

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

//this.getInitParameter(); //初始化参数

//this.getServletContext(); // servlet 上下文

//this.getServletConfig(); servlet 配置

ServletContext servletContext = this.getServletContext();

String username="我爱学习";

//将一个数据保存在ServletContext中 名字为 uesrname 值为 username

servletContext.setAttribute("username",username);

System.out.println("hello");

}

}

输出的类

public class show extends HttpServlet {

@Override

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

ServletContext servletContext = this.getServletContext();

resp.setContentType("text/html");

resp.setCharacterEncoding("utf-8");

String username = (String) servletContext.getAttribute("username");

resp.getWriter().print("姓名:"+username);

}

}

配置的文件

test

com.srx.test

test

/test

getc

com.srx.show

getc

/getc

测试访问结果

2.获取初始化参数

url

JDBC:mysql//localhost:3306/mybatis

测试类

public class context extends HttpServlet {

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

ServletContext Context = this.getServletContext();

String url = Context.getInitParameter("url");

resp.getWriter().print(url);

}

}

路径

url

com.srx.context

url

/url

3.请求转发

public class ServletDemo extends HttpServlet {

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

System.out.println("进入了这个方法");

ServletContext context = this.getServletContext();

// RequestDispatcher zf = context.getRequestDispatcher("zf"); //转发的路径

// zf.forward(req,resp); //调用forward 方法 实现转发

//简写

context.getRequestDispatcher("/getc").forward(req,resp);

}

}

zzz

com.srx.ServletDemo

zzz

/zzz

4.读取资源文件

properties

在java目录中新建properties

zairesource目录下新建properties

发现:都被打包到了同一个路径下;classes 我们俗称这个路径为classpath;

思路: 需要一个文件流

public class ServletDemo1 extends HttpServlet {

@Override

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

InputStream is = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");

Properties prop = new Properties();

prop.load(is);

String user = prop.getProperty("username");

String pwd = prop.getProperty("password");

resp.getWriter().print(user+":"+pwd);

}

@Override

protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

doGet(req,resp);

}

}

映射

bbb

com.srx.ServletDemo1

bbb

/bbb

6、HttpServletResponse

web服务器接收到客户端的http请求,针对这个请求,反别创建一个代表请求的HttpServletRequest对象,代表响应的一个HttpServletResponse;

如果获取客户端请求过来的参数 找 httpServletRequest

如果要给客户端响应一些信息:找HttpServletResponse

1下载文件

向浏览器输出信息

2 下载文件

要获取下载文件的路径

下载的文件名是啥

设置想办法让浏览器支持下载我们所需要的东西

获取下载文件的输入流

创建缓冲区

获得OutputStream对象

将FileOutputStream流写入到Buffer缓冲区

使用OutputStream将缓冲区中的数据输出到客户端。

案例

public class FileServlet extends HttpServlet {

@Override

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

// - 要获取下载文件的路径

String realPath = "D:\\软件安装路径\\javaweb-02-servlet\\response\\target\\classes\\111.png";

System.out.println("文件的下载路径"+realPath);

// - 下载的文件名是啥

String substring = realPath.substring(realPath.lastIndexOf("\\") + 1);

// - 设置想办法让浏览器支持下载我们所需要的东西

resp.setHeader("Content-Disposition","attachment;filename="+ URLEncoder.encode(substring,"utf-8"));

// - 获取下载文件的输入流

FileInputStream in = new FileInputStream(realPath);

// - 创建缓冲区

int len = 0;

byte[] buffer=new byte[1024];

// - 获得OutputStream对象

ServletOutputStream outputStream = resp.getOutputStream();

// - 将FileOutputStream流写入到Buffer缓冲区 使用OutputStream将缓冲区中的数据输出到客户端

while ((len=in.read(buffer))>0){

outputStream.write(buffer,0,len);

}

in.close();

out.close();

}

@Override

protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

doGet(req, resp);

}

}

3 随机刷新的验证码图片

public class ImgServlet extends HttpServlet {

@Override

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

//使浏览器2秒刷新一次;

resp.setHeader("refresh","0.5");

//在内存中创建一个图片

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");

}

num =sb.toString()+num;

return num;

}

@Override

protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

doGet(req, resp);

}

}

4 重定向

b一个web资源收到客户端a请求后,b他回通知a客户端去访问另一个web资源c,这个过程叫重定向

常见场景:

用户登录

void sendRedirect(String var1) throws IOException;

测试:

public class RedirectServlet extends HttpServlet {

@Override

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

// //具体实现

// resp.setHeader("Location","/rr/img");

// resp.setStatus(302);

//重定向

resp.sendRedirect("/rr/img");

}

@Override

protected void doPost(HttpServletRequest req, HttpServletReshttp://ponse resp) throws ServletException, IOException {

doGet(req, resp);

}

}

面试题:请你聊一聊重定向和转发的区别?

相同点:

页面都会实现跳转

不同点:

请求转发的时候 url不会产生变化

重定向时候,url地址栏回发生变化

总结

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:java小程序之控制台字符动画的实现
下一篇:豆瓣电影api跨域(豆瓣电影api跨域访问)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~