java-web


Mave

问题

  1. idea中maven项目默认生成的web.xml文件头从tomcat中root中复制头出来,版本变为4.0

    <?xml version="1.0" encoding="UTF-8"?>
    
        
    
    
Servlet

依赖



    javax.servlet
    javax.servlet-api
    3.1.0




    javax.servlet.jsp
    javax.servlet.jsp-api
    2.3.3

  1. xml配置

    <?xml version="1.0" encoding="UTF-8"?>
    
    
        
        
            helloServlet
            com.moral.HelloServlet
        
        
        
            helloServlet
            
            /hello
        
    
    
    
  2. Servlet

    //用了@WebServlet就不用web.xml配置访问路径了
    //@WebServlet(name = "HelloServlet",value="/hello")
    public class HelloServlet extends HttpServlet {
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            //响应类型
            response.setContentType("text/html");
            //获取响应的输出流
            PrintWriter out = response.getWriter();
            out.println("nihao");
        }
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doPost(request, response);
        }
    }
    

java-web

项目结构
  1. 新建空的maven项目,删除src目录
  2. 新建model,maven的webapp模板,在main下新建java,设为Sources Root,新建resources设为Resources Root
  3. 修改WEB_INF/web.xml为最新,项目结构完成
servlet

-HelloServlet ---extends-- HttpServlet---extends---GenericServlet----immplents----Servlet

  1. 右键新建servlet,重写doGet和doPost方法
  2. 编写servlet映射,是为了给配置一个路径然后在可以通过浏览器去访问
  3. 配置tomcat,配置项目路径
servlet生命周期
  1. 默认第一次请求时,执行init,

    可以在标签下配置,>=0时,服务器启动时init

    servlet单例,init只执行一次

  2. 提供服务执行service方法,每次访问Servlet时,Service方法都会被调用一次

  3. servlet被销毁时执行destroy。服务器关闭时,Servlet被销毁,服务器正常关闭时,才会执行destroy方法。

Mapping映射

  1. 一个servlet可以映射多个路径,通配符

    
    	helloServlet
    	/hello1
    
    
    
    	helloServlet
    	/hello2
    
    
  2. 映射通用

    
    	helloServlet
    	/hello/*
    
    
  3. 默认请求路径

    
    
    	helloServlet
    	/*
    
    
  4. 自定义后缀映射

    
    
    	helloServlet
    	*.jpy
    
    
  5. 优先级问题

    先走固有的,找不到走默认的

ServletContext

web容器在启动的时候,会为每个web程序都创建一个对应的ServletContext对象,代表了当前的web应用

共享数据

一个servelet保存的数据可以在另一个Servlet中拿到

Servlet1 存

ServletContext context = this.getServletContext();
context.setAttribute("username","jpy");//数据存入servletContext

Servlet2 取

ServletContext context = this.getServletContext();
context.getAttribute("username");//取
获取初始化参数

存:



	url
	www.baidu.com

取:

ServletContext context = this.getServletContext();
String url = context.getInitParameter("url");
请求转发
ServletContext context = this.getServletContext();
context.getRequestDispatcher("/getParameter").forward(request,response);
读取资源文件

Properties

java和resources都新建properties文件,默认值能导出resources下文件,要想导出java下的properties。可以在pom.xml中配置,需刷新pom依赖

思路:需要文件流


	
    
        
        	src/main/resources
        		
            		**/*.properties
           			**/*.xml
        		
        		true
        

        
        	src/main/java
            	
                    **/*.properties
       				**/*.xml
            	
        	true
        
    

@WebServlet(name = "HelloServlet")
public class HelloServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //因为服务器上的配置文件绝对路径不容易拿到,而生成的配置文件都会在/WEB_INF/classes下
        InputStream is = this.getServletContext().getResourceAsStream("/WEB_INF/classes/123.properties");
        Properties properties = new Properties();
        properties.load(is);
        String username = properties.getProperty("username");
        String password = properties.getProperty("password");
        response.getWriter().print(username + "==" + password);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}

Response

1.简单分类
发送数据
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 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);
响应状态码
2.常见应用
  • 向浏览器输出信息

  • 下载文件

    • 路径
    • 文件名
    • 设置让浏览器能够支持下载我们要的资源
    • 获取下载文件的输入流
    • 创建缓冲区
    • 获取OutputStream对象
    • 将FileOutputStream流写入到buffer缓冲区
    • 使用OutputStream将缓冲区中的数据输出到客户端
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //- 路径
            String realPath = "D:\\tools\\java-web\\res\\target\\res\\WEB-INF\\classes\\你好.png";
            //- 文件名
            String fileName = realPath.substring(realPath.lastIndexOf("\\") + 1);
            //- 设置让浏览器能够支持下载我们要的资源,URLEncoder.encode防止中文文件名乱码
            resp.setHeader("Content-Disponsition", "attachment; filename=" + URLEncoder.encode(fileName,"utf-8"));
            //- 获取下载文件的输入流
            FileInputStream fis = new FileInputStream(realPath);
            //- 创建缓冲区
            int len = 0;
            byte[] buffer = new byte[1024];
            //- 获取OutputStream对象
            ServletOutputStream os = resp.getOutputStream();
            //- 将FileOutputStream流写入到buffer缓冲区
            //- 使用OutputStream将缓冲区中的数据输出到客户端
            while ((len = fis.read(buffer)) != -1) {
                os.write(buffer, 0, len);
            }
    
            os.close();
            fis.close();
        }
    
  • 重定向

    状态码:302

    例:项目路径/hello,重定向到/index.jsp,必须写出/hello/index.jsp

    而request转发不需要,此时/代表当前项目,直接写成:/index.jsp

    void sendRedirect(String var1) throws IOException;
    //重定向
    resp.sendRedirect("");
    

Request

  • 获取前端参数

    //获取前端数据
    req.getParameter("");
    //获取前端多选框数据
    req.getParameterValues("");
    
  • 请求转发

    状态码:307

    //请求转发
    req.getRequestDispatcher("/index.jsp").forward(req, resp);