Servlet 简介
Servlet 是什么?
Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。
使用 Servlet,您可以收集来自网页表单的用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页。
- 性能明显更好。
- Servlet 在 Web 服务器的地址空间内执行。这样它就没有必要再创建一个单独的进程来处理每个客户端请求。
- Servlet 是独立于平台的,因为它们是用 Java 编写的。
- 服务器上的 Java 安全管理器执行了一系列限制,以保护服务器计算机上的资源。因此,Servlet 是可信的。
- Java 类库的全部功能对 Servlet 来说都是可用的。它可以通过 sockets 和 RMI 机制与 applets、数据库或其他软件进行交互。
servlet 的配置对象
一 对象获取方式
方式一:
声明一个成员变量保存该对象
通过init方法获取ServletConfig对象
public class Demo01 extends HttpServlet { // 声明一个成员变量保存该对象 private ServletConfig config; //给成员变量赋值 @Override public void init(ServletConfig config) throws ServletException { // TODO Auto-generated method stub super.init(config); this.config=config;} }
方式二:
直接调用父类的getServletConfig()方法
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { (直接调用父类的方法) ServletConfig config2 = this.getServletConfig(); String value2 = config2.getInitParameter("weige"); System.out.println(value2); }
作用:
获取Servlet的配置信息 此对象是每个Servlet 都具有的;可通过该对象获取servlet的配置信息
private void fun1() { System.out.println(this.config); //可以通过ServletConfig对象获取Servlet的配置信息 String value = this.config.getInitParameter("wanglong"); System.out.println(value); //获取多个配置信息 Enumeration<String> names = this.config.getInitParameterNames(); while (names.hasMoreElements()) { System.out.println(names.nextElement()); }
servlet 的域对象
servletContext :作用范围最大的域对象,作用域整个工程项目,并且此对象是个单例对象;
作用:可以利用单例的特点用来传值.该对象内部维护了一个map集合,而且所有的域对象内部都是维护了一个map集合;
1.存值取值 setAttribute getAttribute
2.获取全局配置信息
3.可以获取服务器上所有的资源的真实路径 getrealpath()
4.可以进行请求转发
该对象的获取方法
方式一: 通过ServletConfig 对象获取public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ServletContext context = this.getServletConfig().getServletContext(); //向context 保存一个值 context.setAttribute("username", "wanglong"); }
方式二:通过父类获取 该方法在ServletConfig 接口中
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ServletContext context = this.getServletContext(); context.setAttribute("user", "我是王老五"); //获取ServletContext 配置信息 String value = context.getInitParameter("kuner"); System.out.println(value); }
取值:
public class Demo03 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //取出Context域中的值 ServletContext context = this.getServletConfig().getServletContext(); Object obj = context.getAttribute("username"); System.out.println(obj); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }该域对象作用于整个工程,因此在该工程的任意的一个servlet 都可以获取到设置的值.
2.获取服务器上的资源路径
如上图在工程下不同的位置新建 a b c 三个properties文件
public class Demo04 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //fun1(); //读取b and c.properties文件 String path2 = this.getServletContext().getRealPath("/WEB-INF/classes/com/lanou3g/b.properties"); String path3 = this.getServletContext().getRealPath("/WEB-INF/c.properties"); System.out.println(path2); System.out.println(path3); //读文件 FileInputStream fis2 = new FileInputStream(path2); Properties properties2 = new Properties(); properties2.load(fis2); FileInputStream fis3 = new FileInputStream(path3); Properties properties3 = new Properties(); properties3.load(fis3); System.out.println(properties2.getProperty("key")); System.out.println(properties3.getProperty("key")); } private void fun1() throws FileNotFoundException, IOException { //读取a.properties 文件 //参数路径是相对于工程名 String path = this.getServletContext().getRealPath("/WEB-INF/classes/a.properties"); System.out.println(path); //读文件 FileInputStream fis = new FileInputStream(path); Properties properties = new Properties(); properties.load(fis); System.out.println(properties.getProperty("key")); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
4.请求转发
1.用户只发起了一次请求
2.用户请求是并不知道 网站内部做了什么
public class Demo05 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("借点钱,萧峰兄弟"); System.out.println("老兄:我没有 ,你去找坤儿"); //通过context对象获取请求转发器 //转发: 请求转发只能是站内转发(本工程) //并且转发的路径是相对于你的工程 RequestDispatcher dispatcher = this.getServletContext().getRequestDispatcher("/demo06");//转发器 //请求转发 dispatcher.forward(request, response); System.out.println("钱借到了,人傻好办事"); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
public class Demo06 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("我是坤儿,我有随便花"); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }打印结果如下:
可以看出demo05 的需求被转发到 demo06 但是浏览器上并没有跳转到demo06;
响应 response
响应行 响应的状态码 200 http协议 1.1
响应头 告诉浏览器我要做什么操作 ?
告诉浏览器你需要使用什么编码格式来解析我的响应
响应体 响应浏览器的内容
响应头设置应用public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //Tomcat默认的编码格式是 ISO-8859-1 不支持中文; /*response.setCharacterEncoding("utf-8"); //设置响应头告诉浏览器你需要使用什么编码格式来解析数据 response.setHeader("Content-type", "text/html;character=UTF-8");*/ //合并写法 (写Servlet 是第一句先写编码格式) response.setContentType("text/html;charset=UTF-8"); //接到请求后向浏览器写个字符串 //通过响应对象中的流对象回写 //注意:;如果你当前在servlet中使用的字符流 //那么就不能在写字节流了 PrintWriter writer = response.getWriter(); writer.write("wanglong你好啊"); }
响应浏览器内容 下载一张图片;
添加一张图片到工程内;
package com.lanou3g; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintWriter; import java.nio.file.Path; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /* * 从服务器中下载图片 *获取服务器的图片路径 *读文件 *通过respose 获取字节流回写 * *告诉浏览器(添加响应头) *1.我给的这个图片是下载用的 *2.文件名 文件类型 * content-disposition attachment;filename= content-type image/jpeg/png... */ public class Demo08 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String path = this.getServletContext().getRealPath("/WEB-INF/classes/宝宝心里苦.png"); File file = new File(path); String name = file.getName(); //修改文件名的编码格式 name = new String(name.getBytes(), "iso-8859-1"); //添加响应头 response.setHeader("content-disposition", "attachment;filename="+name); response.setHeader("content-type", "image/png"); //读文件 FileInputStream fis = new FileInputStream(path); ServletOutputStream out = response.getOutputStream(); int len = 0; byte [] b = new byte [1024]; while ((len = fis.read(b))!=-1) { out.write(b, 0, len); } fis.close(); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
请求重定向
public class Demo09 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //fun1(response); //3秒后 跳转一个页面 //添加一个刷新头 //response.setHeader("refresh", "3;url=/sh-web-02/demo10"); response.setIntHeader("refresh", 1); PrintWriter writer = response.getWriter(); writer.write(Math.random()+" "); } private void fun1(HttpServletResponse response) { System.out.println("我借钱"); System.out.println("你去找demo10"); //添加请求重定向 响应头 //参数二是重定向的 路径(站内站外网址都可以) 站内路径需要带上工程名 //response.setHeader("location", "/sh-web-02/demo10"); response.setHeader("location", "http://baidu.com"); //添加状态码302 response.setStatus(302); System.out.println("借完了"); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
public class Demo10 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("我是demo10---找我借钱吗,门都没有"); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
请求重定向
注意: 请求重定向是两次请求
第二次请求是接到第一次请求的响应头之后发生的 可以看到浏览器中denmo09跳转到了demo10
请求 request
请求中的方法
//获取请求的方式 String method = request.getMethod(); System.out.println(method); //获取请求的URL StringBuffer requestURL = request.getRequestURL(); System.out.println(requestURL); //获取请求的URI String requestURI = request.getRequestURI(); System.out.println(requestURI); //获取请求网址的相对路径 String contextPath = request.getContextPath(); System.out.println(contextPath);
使用 Servlet 读取表单数据 并连接访问数据库
getParameter():您可以调用 request.getParameter() 方法来获取表单参数的值。
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //获取表单提交的数据 //通过表单中 name属性 来获取输入框中的数据 String username = request.getParameter("username"); String password = request.getParameter("password"); System.out.println(username); System.out.println(password); //连接数据库查询 Connection conn = null; PreparedStatement statement = null; ResultSet resultSet = null; String sql = "select * from user where username=? and password =?"; try { conn = JDBCUtil.getConnection(); statement = conn.prepareStatement(sql); statement.setObject(1, username); statement.setObject(2, password); resultSet = statement.executeQuery(); if (resultSet.next()) { System.out.println("登录成功 欢迎" + username); } } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally { //关闭资源 JDBCUtil.closeAll(resultSet, statement, conn); } }