Java web学习
Maven
背景:
- javaweb开发中需要大量的jar包
- 让一个东西自动导入和配置jar包
Maven:架构管理工具
**核心思想:**约定大于配置
- 有约束,不要去违反
Maven会规定你该如何去编写java代码
Servlet
简介
- sun公司开发动态web的一门技术
- Sun在这些api中提供了一个接口,叫做Servlet
- 编写类,实现Servlet接口
- 部署到web服务器中
ServletContext对象
web容器在启动的时候,它会为每一个web程序都创建一个对应的ServletContext对象,它代表了当前的web应用
this.getInitParameter() //获取 初始化参数
this.getServletConfig() //获取Servlet的配置
this.getServletContext() //获取ServletContext对象
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doGet(req, resp);
ServletContext servletContext = req.getServletContext();
}
作用
-
实现Servlet之间的数据共享
-
可以保存一些东西
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { super.doGet(req, resp); ServletContext servletContext = req.getServletContext(); String username ="测试"; servletContext.setAttribute("username",username);//将一个数据保存在ServletContext,名字为username,值为username }
RequestDispatcher getRequestDispatcher(String var1);
servletContext.getInitParameter(); //获取web应用的初始化参数(在web.xml中)
//请求转发
servletContext.getRequestDispatcher(String s);//获取转发的请求路径
requestDispatcher.forward(req,resp); //调用forward实现请求转发,但浏览器的url不会改变
读取资源文件,把文件变成流
Properties
- 在java目录下新建properties
- 在resources目录下新建properties
都被打包同一个路径下:classes,类路径:classpath
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doGet(req, resp);
ServletContext servletContext = req.getServletContext();
servletContext.getInitParameter();
RequestDispatcher requestDispatcher = servletContext.getRequestDispatcher("/jdbc.find");
requestDispatcher.forward(req,resp);
Properties properties=new Properties();
InputStream is =servletContext.getResourceAsStream("/WEB-INF/classes/db.properties");
properties.load(is);
properties.getProperty("username")
}
HttpServletRequest
HttpServletRequest代表客户端的请求,用户通过http协议访问服务器,http请求中的所有信息会被封装HttpServletRequest,通过HttpServletRequest可以获取客户端的所有信息
1.获取前端传递的参数
String getParameter(String var1);//常用
Enumeration<String> getParameterNames();
String[] getParameterValues(String var1);//常用
Map<String, String[]> getParameterMap();
后台接收中文乱码问题
req.setCharacterEncoding("UTF-8");
2.请求转发
RequestDispatcher getRequestDispatcher(String var1);
void forward(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;
HttpServletResponse
响应:
web服务器接收到客户端的http请求,针对这个请求,分别创建代表请求的HttpServletRequest对象,一个代表响应的HttpResponse
分类
负责向浏览器发送数据的方法
PrintWriter getWriter() throws IOException;
ServletOutputStream getOutputStream() throws IOException
负责向浏览器发送响应头的方法
void setCharacterEncoding(String var1);
void setContentLength(int var1);
void setContentLengthLong(long var1);
void setContentType(String var1);
void setHeader(String var1, String var2);
void setStatus(int var1);
常见应用
1.向浏览器输出消息
2.下载文件
-
要获取下载文件的路径
-
下载的文件名
-
设置让浏览器支持下载我们需要的东西
-
获取下载文件的输入流
-
创建缓冲区
-
获取IntputStream对象
-
将FileIntputStream流写入到buffer缓冲区
-
使用OutputSteam将缓冲区的数据输入到客户端
public class Demo5 extends HelloServlet{ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { super.doGet(req, resp); // - 要获取下载文件的路径 String realpath=this.getServletContext().getRealPath("/1.png"); // - 下载的文件名 realpath.substring(realpath.lastIndexOf("//")+1); // - 设置让浏览器支持下载我们需要的东西 resp.setHeader("Content-Disposition", "attachment; filename=\"" + new String(fileName.getBytes(),"ISO-8859-1”) + "\""); // - 获取下载文件的输入流 FileInputStream fileInputStream =new FileInputStream(realpath); // - 创建缓冲区 int len =0; byte[] buffer=new byte[1024]; // - 获取IntputStream对象 ServletOutputStream out =resp.getOutputStream(); // - 将FileIntputStream流写入到buffer缓冲区 while((len=fileInputStream.read(buffer))>0) { out.write(buffer,0,len); } // - 使用OutputSteam将缓冲区的数据输入到客户端 out.close(); fileInputStream.close(); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { super.doPost(req, resp); } }
3.验证码功能
后端实现java图片类(生成一个图片验证码)
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//让浏览器5秒自动刷新一次
resp.setHeader("refresh","5");
//在内存中创建一个图片
BufferedImage bufferedImage=new BufferedImage(80,20,BufferedImage.TYPE_INT_RGB);
//得到图片
Graphics2D graphics= (Graphics2D) bufferedImage.getGraphics();
//设置图片的背景颜色
graphics.setColor(Color.black);
graphics.fillRect(0,0,80,20);
//给图片写数据
graphics.setColor(Color.cyan);
graphics.setFont(new Font(null,Font.ITALIC,20));
graphics.drawString(makeNum(),0,20);
//告诉浏览器,这个请求用图片的方式打开
resp.setContentType("image/jpeg");
//网站存在缓存,不让浏览器存缓存
resp.setDateHeader("expires",-1);
resp.setHeader("Cache-Control","no-cache");
resp.setHeader("Pragme","no-cache");
//把图片写给浏览器
ImageIO.write(bufferedImage,"jpg",resp.getOutputStream());
}
//生成随机数
private String makeNum()
{
Random random = new Random();
String s =random.nextInt(9999999)+"";
StringBuffer stringBuffer = new StringBuffer();
//用0填充,使其成为8位
for (int i=0;i<8-s.length();i++)
{
stringBuffer.append("0");
}
return stringBuffer.toString()+s;
}
4.实现重定向
一个web资源收到客户端请求后,会通知客户端去访问另外一个web资源,这个过程叫重定向
void sendRedirect(String var1) throws IOException;
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
/* 重定向的实质
resp.setHeader("Location","/r/index.jsp");
resp.setStatus(302);
*/
resp.sendRedirect("/index.jsp");
}
面试题:重定向和转发的区别?
相同:
- 页面会实现跳转
不同
- url会不会产生变化 307,302
${pageContext.request.contextPath} <%--获取当前web目录--%>
resp.setHeader("Location","/r/index.jsp");
resp.setStatus(302);
*/
resp.sendRedirect("/index.jsp");
}
面试题:重定向和转发的区别?
相同:
- 页面会实现跳转
不同
- url会不会产生变化 307,302
${pageContext.request.contextPath} <%--获取当前web目录--%>