javaweb--servlet
Servlet简介:
Servlet是Sun公司开发动态Web的一门技术
sun在这些API中提供一个接口叫Servlet,开发servlet程序需要下面两个步骤:
1.编写一个类,实现servlet接口(实现HttpServlet接口就行)
2.将写好的java类部署到web服务器中
构建HelloServlet项目:
1.导入依赖
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.3</version>
</dependency>
2.创建类实现httpServlet接口
public class HelloServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { PrintWriter writer = resp.getWriter();//响应流 writer.print("helloword"); }
3.在web.xml编写映射关系
<servlet>
<servlet-name>helloServlet</servlet-name>
<servlet-class>com.zhs.servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>helloServlet</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
4.配置tomcat服务器
5.运行ok
Servlet原理:
Servlet是由Web服务器调用,Web服务器在收到请求后

ServletContext:
Web容器在启动时,他会为每个web程序创建一个对应的Servletcontext对象,他代表了当前的web应用。
1.共享数据:在这个servlet中保存的数据,可以在另一个servlet中拿到
存放数据:
public class HelloServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //相应编码的格式 resp.setContentType("text/html"); resp.setCharacterEncoding("utf-8"); ServletContext context = this.getServletContext();//获取上下文 String username="张三"; context.setAttribute("username", username); // String user = (String)context.getAttribute(username); // resp.getWriter().print("名字:"+user); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { }
取出数据:
public class GetServlet extends HttpServlet { @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //相应编码 resp.setContentType("text/html"); resp.setCharacterEncoding("utf-8"); ServletContext context = this.getServletContext(); String username = (String)context.getAttribute("username");//强转为string类型 resp.getWriter().print("你的名字是:"+username); }
注册映射路径:
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.zhs.servlet.HelloServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>getc</servlet-name>
<servlet-class>com.zhs.servlet.GetServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hellos</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>getc</servlet-name>
<url-pattern>/getname</url-pattern>
</servlet-mapping>
运行,先进入/hellos存入数据,在进入/getname,可以拿到在第一个servlet中的数据
2.获取初始化参数
创建类:
public class ServletDemo1 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { ServletContext context = this.getServletContext(); String url = context.getInitParameter("url"); resp.getWriter().print(url); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { }
配置要获取的参数
<context-param>
<param-name>url</param-name>
<param-value>123456hello</param-value>
</context-param>
配置映射
<servlet>
<servlet-name>demo1</servlet-name>
<servlet-class>com.zhs.servlet.ServletDemo1</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>demo1</servlet-name>
<url-pattern>/getdemo1</url-pattern>
</servlet-mapping>
运行成功获取参数
123456hello
3.请求转发
public class ServletDemo2 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { ServletContext context = this.getServletContext(); context.getRequestDispatcher("/getdemo1").forward(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { }
<servlet>
<servlet-name>demo2</servlet-name>
<servlet-class>com.zhs.servlet.ServletDemo2</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>demo2</servlet-name>
<url-pattern>/getdemo2</url-pattern>
</servlet-mapping>
运行成功跳转到另一个页面
4.读取资源文件
package com.zhs.servlet; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.InputStream; import java.util.Properties; public class ServletDemo3 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { InputStream is = this.getServletContext().getResourceAsStream("/WEB-INF/classes/dd.properties"); Properties prop=new Properties(); prop.load(is); String username = prop.getProperty("username"); String password = prop.getProperty("password"); resp.getWriter().print(username+password); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { } }
<servlet>
<servlet-name>demo3</servlet-name>
<servlet-class>com.zhs.servlet.ServletDemo3</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>demo3</servlet-name>
<url-pattern>/getdemo3</url-pattern>
</servlet-mapping>
运行获取文件流
Response下载文件步骤:
1.要获取下载文件的路径
2.下载的文件名是啥
3.设置想办法让浏览器能够支持下载我们的东西
4.获取下载文件的输入流
5.创建缓存区
6.获取OutputStream对象
7.将FileOutputStream流写入到buffer缓存区
8.使用outputStream将缓存区的数据输入到客户端
package com.zhs.servlet; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.FileInputStream; import java.io.IOException; public class ResponseDown extends HttpServlet { @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 1.要获取下载文件的路径E:\JavaBase\javawebservlet\response_downFile\target\classes\monster.png String realPath = "E:\\JavaBase\\javawebservlet\\response_downFile\\target\\classes\\monster.png"; System.out.println("下载文件的路径:"+realPath); // 2.下载的文件名是啥 String filename = realPath.substring(realPath.lastIndexOf("\\") + 1); // 3.设置想办法让浏览器能够支持(Content-Disposition)下载我们的东西 resp.setHeader("Content-Disposition", "attachment; filename="+ URLEncoder.encode(filename, "utf-8"));
// 4.获取下载文件的输入流 FileInputStream in = new FileInputStream(realPath);
// 5.创建缓存区 int len=0; byte[] buffer = new byte[1024];
// 6.获取OutputStream对象 ServletOutputStream out = resp.getOutputStream();
// 7.将FileOutputStream流写入到buffer缓存区,使用outputStream将缓存区的数据输入到客户端
while ((len=in.read(buffer))>0){ out.write(buffer,0,len); }
in.close(); out.close(); } }
<servlet>
<servlet-name>re</servlet-name>
<servlet-class>com.zhs.servlet.ResponseDown</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>re</servlet-name>
<url-pattern>/down</url-pattern>
</servlet-mapping>
正常弹出下载提示
Response验证码实现:
@Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //让浏览器每三秒刷新一次 resp.setHeader("refresh", "3"); //在内存中创建一个图片 BufferedImage image = new BufferedImage(80,20,BufferedImage.TYPE_INT_BGR); //得到图片 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("Pragma", "no-cache"); //把图片写给浏览器 ImageIO.write(image, "jpg", resp.getOutputStream()); } //生成随机数 public 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; }
<servlet>
<servlet-name>img</servlet-name>
<servlet-class>com.zhs.servlet.ImaageServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>img</servlet-name>
<url-pattern>/img</url-pattern>
</servlet-mapping>

浙公网安备 33010602011771号