- 构建一个普通的Maven项目,删掉里面的src目录
- 引入servlet依赖
javax.servlet javax.servlet-api 4.0.1
- 创建子项目
- 创建表现层类并继承HttpServlet类,重写父类的doGet和doPost方法
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//响应的文本类型
resp.setContentType("text/html");
//设置编码
resp.setCharacterEncoding("utf-8");
//获取响应的输出流,将数据输出到网页
PrintWriter out = resp.getWriter();
out.println("");
out.println("");
out.println("hello world!!!! ");
out.println("");
out.println("");
out.println("你好");
out.println("");
out.println("");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp);
}
}
- 在web.xml文件中注册servlet
hello com.kuang.HelloServlet hello /
- 配置Tomcat
- 启动测试
一个servlet对应一个mapping映射
一个servlet对应多个mapping映射
通用映射路径请求映射
指定后缀实现请求映射
ServletContexthello /hello hello /hello2 hello /* hello *.do
web容器在启动的时候,它会为每个web程序都创建一个对应的ServletContext对象,它代表了当前的web应用
1 共享数据我在这个Servlet中保存的数据,可以在另外一个servlet中拿到
1.将数据保存到ServletContext中
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
String name="安";
//将数据以键值对方法保存在ServletContext中
context.setAttribute("name",name);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp);
}
}
2.从ServletContext中获得数据
public class GetServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
//从ServletContext中获得数据
String name = (String) context.getAttribute("name");
//返回文本类型
resp.setContentType("text/html");
//设置编码格式
resp.setCharacterEncoding("utf-8");
resp.getWriter().println("姓名=" + name);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
3.配置web.xml
2 获取初始化参数hello com.kuang.HelloServlet hello /hello get com.kuang.GetServlet get /get
1.在web.xml中配置初始化参数
url jdbc:mysql url com.kuang.ServletDemo3 url /url
2.获取初始化参数
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext servletContext = this.getServletContext();
//获取初始化参数
String url = servletContext.getInitParameter("url");
resp.getWriter().println(url);
}
3 请求转发
1
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
//转发的请求路径
RequestDispatcher requestDispatcher = context.getRequestDispatcher("/get");
//调用forward实现请求转发
requestDispatcher.forward(req, resp);
}
2
4 读取资源文件get com.kuang.GetServlet get /get sd4 com.kuang.ServletDemo4 sd4 /sd4
读取properties文件
- 创建properties文件(一般创建在resources文件夹里)
username=root password=123456
2.获得properties文件
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//将文件变成流
InputStream is = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");
//创建Properties对象来操作properties文件
Properties prop = new Properties();
//传入流文件
prop.load(is);
//传入key获得values
String username = prop.getProperty("username");
String password = prop.getProperty("password");
resp.getWriter().println(username+""+password);
}
3.配置servlet
5 HttpServletResponse 响应db com.kuang.PropertiesServlet db /db
HttpServletRequest代表客户端的请求,用户通过Http协议访问服务器,HTTP请求中的所有信息会被封装到HttpServletRequest,通过这个HttpServletRequest的方法,获得客户端的所有信息;
- 如果要获取客户端请求过来的参数:找HttpServletRequest
- 如果要给客户端响应一些信息:找HttpServletResponse
负责向浏览器发送数据的方法
ServletOutputStream getOutputStream() PrintWriter getWriter()
负责向浏览器发送响应头的方法
void setCharacterEncoding(String var1); void setContentLength(int var1); void setContentLengthLong(long var1); void setContentType(String 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);5.2下载文件
- 要获取下载文件的路径
- 下载的文件名是啥?
- 设置想办法让浏览器能够支持下载我们需要的东西
- 获取下载文件的输入流
- 创建缓冲区
- 获取OutputStream对象
- 将FileOutputStream流写入到buffer缓冲区,使用OutputStream将缓冲区中的数据输出到客户端!
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1. 要获取下载文件的路径
String path = "D:\kuang\javaWeb\javaweb-02-servelt\response\target\response\WEB-INF\classes\images\1.jpg";
//2. 下载的文件名是啥?
int i = path.lastIndexOf("\") + 1;
String fileName = path.substring(i);
System.out.println(fileName);
//3. 设置想办法让浏览器能够支持下载我们需要的东西
//中文文件名使用URLEncoder.encode(fileName,"UTF-8")转换编码
resp.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
//4. 获取下载文件的输入流
FileInputStream in = new FileInputStream(path);//将文件变成流
//5. 创建缓冲区
int len = 0;
byte[] buffer = new byte[1024];
//6. 获取OutputStream对象
ServletOutputStream outputStream = resp.getOutputStream();
//7. 将FileOutputStream流写入到buffer缓冲区,使用OutputStream将缓冲区中的数据输出到客户端!
while ((len = in.read(buffer)) > 0) {
outputStream.write(buffer, 0, len);
}
//关闭流
in.close();
outputStream.close();
}
5.3验证码
public class ImageServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//如何让浏览器3秒刷新一次
resp.setHeader("refresh", "3");
//在内存中创建一个图片
BufferedImage image = new BufferedImage(80, 20, BufferedImage.TYPE_INT_RGB);
//得到图片
Graphics2D g = (Graphics2D) image.getGraphics();//笔
//设置图片的背景颜色
g.setColor(Color.cyan);//设置颜色
g.fillRect(0, 0, 80, 20);//填充颜色
//给图片写数据
g.setColor(Color.green);
g.setFont(new Font(null, Font.BOLD, 20));
g.drawString(makeNum(), 0, 20);
//告诉浏览器这个请求用图片的方式打开
resp.setContentType("image/png");
//把图片写给浏览器
ImageIO.write(image, "png", resp.getOutputStream());
}
//创建随机数
private String makeNum() {
String num = (int) (Math.random() * 1000000) + "";
StringBuffer sb = new StringBuffer();
for (int i = 0; i < 7 - num.length(); i++) {
sb.append("0");
}
num = sb + num;
return num;
}
}
5.4 重定向image com.kuang.servlet.ImageServlet image /img
一个web资源收到客户端请求后,他会通知客户端去访问另外一个web资源,这个过程叫重定向
sendRedirect(String var1)重定向
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//重定向
resp.sendRedirect("/r/img");
}
重定向和转发的区别
面试题:请你聊聊重定向和转发的区别?
相同点:
- 页面都会实现跳转
不同点:
- 请求转发的时候,url不会产生变化 编码307
- 重定向时候,url地址栏会发生变化;编码302
跳转的语句不同. 转发速度要高于重定向, 因为请求转发是在服务器内部完成的; 转发的url一定要是在当前web工程内部的地址, 而重定向可以是任意地址;
5.5简单实现登录引入jsp依赖
javax.servlet.jsp jsp-api 2.2 provided
1.编写.jsp页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>Hello World!
<%--action这里提交的路径,需要寻找到项目的路径--%> <%--${pageContext.request.contextPath}代表当前项目--%>
2.处理请求
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//处理请求
//getParameter接收参数
String username = req.getParameter("username");
String password = req.getParameter("password");
System.out.println(username + "====" + password);
//重定向
resp.sendRedirect("/r/success.jsp");
}
3.配置web.xml
6 HttpServletRequest 请求requ com.kuang.servlet.RequestTest requ /login
HttpServletRequest代表客户端的请求,用户通过Http协议访问服务器,HTTP请求中的所有信息会被封装到HttpServletRequest,通过这个HttpServletRequest的方法,获得客户端的所有信息
6.1简单实现登录引入jsp依赖
javax.servlet.jsp jsp-api 2.2 provided
1.编写.jsp页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
Title
登录
<%--action这里提交的路径,需要寻找到项目的路径--%>
<%--${pageContext.request.contextPath}代表当前项目--%>
2.获取参数,请求转发
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//后台接收中文乱码问题
req.setCharacterEncoding("utf-8");
String username = req.getParameter("username");
String password = req.getParameter("password");
String[] hobbies = req.getParameterValues("hobby");
System.out.println(username);
System.out.println(password);
System.out.println(Arrays.toString(hobbies));
//重定向
//resp.sendRedirect("/r/success.jsp");
//通过请求转发
req.getRequestDispatcher("/success.jsp").forward(req, resp);
}
3.注册servlet
login com.kuang.servlet.LoginServlet login /login
4.编写登录成功的jsp页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
Title
登录成功
7 Cookie,Session
7.1会话
会话:用户打开一个浏览器,点击了很多超链接,访问多个web资源,关闭浏览器,这个过程可以称之为会话;
一个网站,怎么证明你来过?
客户端 服务端
- 服务端给客户端一个 信件,客户端下次访问服务端带上信件就可以了;cookie
- 服务器登记你来过了,下次你来的时候我来匹配你; seesion
cookie
- 客户端技术 (响应,请求)
session
- 服务器技术,利用这个技术,可以保存用户的会话信息? 我们可以把信息或者数据放在Session中!
常见场景:网站登录之后,你下次不用再登录了,第二次访问直接就上去了!



