java-web
Mave
问题
-
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
-
xml配置
<?xml version="1.0" encoding="UTF-8"?>
helloServlet com.moral.HelloServlet helloServlet /hello -
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
项目结构
- 新建空的maven项目,删除src目录
- 新建model,maven的webapp模板,在main下新建java,设为Sources Root,新建resources设为Resources Root
- 修改WEB_INF/web.xml为最新,项目结构完成
servlet
-HelloServlet ---extends-- HttpServlet---extends---GenericServlet----immplents----Servlet
- 右键新建servlet,重写doGet和doPost方法
- 编写servlet映射,是为了给配置一个路径然后在可以通过浏览器去访问
- 配置tomcat,配置项目路径
servlet生命周期
-
默认第一次请求时,执行init,
可以在
标签下配置 ,>=0时,服务器启动时init servlet单例,init只执行一次
-
提供服务执行service方法,每次访问Servlet时,Service方法都会被调用一次
-
servlet被销毁时执行destroy。服务器关闭时,Servlet被销毁,服务器正常关闭时,才会执行destroy方法。
Mapping映射
-
一个servlet可以映射多个路径,通配符
helloServlet /hello1 helloServlet /hello2 -
映射通用
helloServlet /hello/* -
默认请求路径
helloServlet /* -
自定义后缀映射
helloServlet *.jpy -
优先级问题
先走固有的,找不到走默认的
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);