JavaWeb学习笔记02 简单的开始
目录
简单的引例
servlet原理图
mapping问题
ServletContext对象的介绍和应用
请求转发和重定向的区别
重定向实例:
扩展:
编写一个servlet程序分成两步:1.编写普通类;2.编写HttpServlet
简单的引例
1.编写HelloServlet.java
package MyExercise;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.PrintWriter;public class HelloServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {PrintWriter writer=resp.getWriter();writer.write("Hello,World!");}
}
作用:在响应回来的页面输出“Hello,World!”
2.在web.xml编写servlet映射
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0"><servlet><servlet-name>hello</servlet-name><servlet-class>MyExercise.HelloServlet</servlet-class></servlet>
<servlet-mapping><servlet-name>hello</servlet-name><url-pattern>/h</url-pattern>
</servlet-mapping></web-app>
作用:要实现网页的访问必须有servlet映射,这样能帮助服务器找到对应的实现类
tips:两个servlet-name的内容要完全一致;servlet-class是写的servlet类所在路径;url-pattern是要在浏览器访问的路径
3.配置tomcat加载war包并运行
运行结果:
servlet原理图
说明:
HttpServletRequest继承自 ServletRequest。客户端浏览器发出的请求被封装成为一个HttpServlet Request对象。对象包含了客户端请求信息包括请求的地址,请求的参数,提交的数据,上传的文件客户端的ip甚至客户端操作系统都包含在其内。
HttpServletResponse是ServletResponse的子接口,HttpServletResponse对象的主要功能用于服务器对客户端的请求进行响应。
service方法中形参接收的是HttpServletResponse接口的实例化对象,这个对象中封装了向客户端发送数据,发送响应头,发送状态码的方法。
mapping问题
1.一个servlet类可以指定多个映射路径,即可通过不同的<url-class>都可以访问同一网页,
2.含有通配符*的路径优先级问题:
如果某个url-class是/h1/*,另一个url-class是/h1/hello,
当我们在浏览器输入localhost:8080/h1/hello时候,浏览器会优先访问url-class是/h1/hello对应的servlet类(更具体的路径)
ServletContext对象的介绍和应用
ServletContext对象介绍:
web容器启动时会给每一个web程序都创建一个对应的servletcontext对象,用来管理当前所有的servlet类,作用是可以实现不同servlet类间的数据共享。
ServletContext对象应用:
1.数据共享:
测试在servlet1设置的数据能否被servlet2拿到
编写servlet类(一个set一个get):
package MyExercise;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class Servlet1 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {ServletContext context=this.getServletContext();String name="xiaoming";context.setAttribute("username",name);//将数据放入context中,username相当于key,name相当于value}
}package MyExercise;import javax.servlet.ServletContext;
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.PrintWriter;public class Servlet2 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {ServletContext context=this.getServletContext();String name=(String) context.getAttribute("username");//object向下强制转型PrintWriter w=resp.getWriter();w.write("成功拿到了username:"+name);}
}
配置web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0"><servlet><servlet-name>s1</servlet-name><servlet-class>MyExercise.Servlet1</servlet-class></servlet>
<servlet-mapping><servlet-name>s1</servlet-name><url-pattern>/s1</url-pattern>
</servlet-mapping><servlet><servlet-name>s2</servlet-name><servlet-class>MyExercise.Servlet2</servlet-class></servlet><servlet-mapping><servlet-name>s2</servlet-name><url-pattern>/s2</url-pattern></servlet-mapping></web-app>
运行结果:
2.获取web.xml中配置的参数
web.xml中设置参数和路径映射:
<web-app><context-param><param-name>url</param-name><param-value>复习一遍:jdbc:mysql://localhost:3306/mydb</param-value></context-param><servlet><servlet-name>gp</servlet-name><servlet-class>MyExercise.getParam</servlet-class></servlet><servlet-mapping><servlet-name>gp</servlet-name><url-pattern>/gp</url-pattern></servlet-mapping>
</web-app>
编写servlet类:
package MyExercise;import javax.servlet.ServletContext;
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.PrintWriter;
public class getParam extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.setContentType("text/html");resp.setCharacterEncoding("utf-8");ServletContext context=this.getServletContext();String url=context.getInitParameter("url");PrintWriter w=resp.getWriter();w.write("成功获取param:"+url);}
}
启动tomcat获得运行结果:
3.读取生成的target文件下的Properties的内容
首先在db.properties中设置内容:
观察发现启动tomcat后其存在target->WEB-INF->classes下:
编写servlet类:
思路是需要一个文件流
public class getProperty extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {ServletContext context=this.getServletContext();InputStream is=context.getResourceAsStream("/WEB-INF/classes/db.properties");Properties prop=new Properties();prop.load(is);//下载String username=prop.getProperty("username");String pwd=prop.getProperty("password");PrintWriter w=resp.getWriter();w.write("user:"+username);w.write("pwd:"+pwd);}
}
配置web.xml并启动tomcat得到运行结果:
4.请求转发
public class Test_RequestDispatcher extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {ServletContext context=this.getServletContext();RequestDispatcher requestDispatcher=context.getRequestDispatcher("/gp");//重定向到映射路径为/gp的页面requestDispatcher.forward(req,resp);}
}
运行结果:
请求转发和重定向的区别
相同点:
都会跳转页面
不同点:
请求转发路径url不会变化
重定向url改变
重定向实例:
编写一个表单Login.jsp,我们要实现的是在请求servlet类的映射路径时跳转到此表单
<%--Created by IntelliJ IDEA.User: joyyiyiDate: 2023/4/5Time: 15:20To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
<%-- 注意这里的action要和web.xml注册的保持一致-%>
<%----%>
<h1>登录页面</h1>
<form action="/lin" method="get"><input type="text" name="username"><input type="submit">
</form></body>
</html>
编写servlet类
public class Test_sendRedirect extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.sendRedirect("/Login.jsp");}
}
这里的斜杠‘/’是重点,表示当前路径,在tomcat设置了怎样的当前路径在重定向的时候也要加上
运行结果:
我输入的路径是:http://localhost:8088/sr
然后重定向跳转到页面:http://localhost:8088/Login.jsp
扩展:
通过response下载图片:
public class FileServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//1.要获取下载图片的路径//2.下载的文件名//3.让浏览器能够支持我们下载的一些东西//4.获取下载图片的输入流//5.放入缓冲区//6.获取outputstream对象//7.将fileoutputstream流写入到buffer缓冲区//8.关闭资源String path="D:\\\\apache_maven_projects\\\\javaweb-filter\\\\src\\\\main\\\\resources\\\\img.png";//这是图片的绝对路径String filename=path.substring(path.lastIndexOf("//")+1);resp.setHeader("Content-Disposition","attachment;filename="+ URLEncoder.encode(filename,"utf-8"));FileInputStream fis=new FileInputStream(path);int len=0;byte[] buffer=new byte[1024];//这里和 PrintWriter w=resp.getWriter();异曲同工ServletOutputStream out=resp.getOutputStream();while ((len=fis.read(buffer))>0){out.write(buffer,0,len);}fis.close();out.close();}
}
记得配置web.xml
运行结果:只有输入网页路径就自动下载请求的图片
今天记录到这,玩去了!!!!