1

转发与重定向区别是什么

  • 在调用方法上
转发 调用 HttpServletRequest 对象的方法
request.getRequestDispatcher("test.jsp").forward(req, resp);

重定向 调用 HttpServletResponse 对象的方法
response.sendRedirect("loginsuccess.jsp");
  • 在URL显示上
转发:URL没有变化
重定向:URL会发生变化
  • 在HTTP请求次数上
转发:请求1次
重定向:请求2次
  • 在行为上
转发:服务器行为
重定向:客户端行为
  • 在数据传递上
转发: 直接传递请求数据
重定向: 必须通过session/application全局中间数据缓存

JSP/Servlet 注意事项

  • JSP/Servlet 初始化时机
JSP :只有当客户端第一次请求JSP时,才需要将其转换、编译以及实例化
Servlet : 只有当服务器启动时(web.xml中配置load-on-startup=1,默认为0)或者第一次请求该servlet时,才会加载和实例化
  • Servlet四大对象
ServletConfigServletContextHttpServletRequestHttpServletResponse

ServletConfig:代表当前Servlet的配置信息(web.xml)
获取ServletConfig方法:
ServletConfig sc = this.getServletConfig();

ServletContext:代表当前Application
获取ServletContext方法:
ServletContext sc = this.getServletContext();

HttpServletRequest:代表请求信息
HttpServletResponse:代表响应信息
  • ServletContext生命周期与作用
Tomcat 启动时,为每个web项目创建对应的ServletContext对象
ServletContext对象何时销毁?第一种:把web应用移除;第二种:把Tomcat服务器停止
作用:是管理WEB资源,读取资源文件等 (请不要使用java文件方式去读取
  • 获取RequestDispatcher对象的方法与区别
2种方法:
1、使用ServletRequest对象
request.getRequestDispatcher();
2、使用ServletContext对象
context.getRequestDispatcher();

区别:
ServletContext.getRequestDispatcher(String path)方法的参数必须以斜杠(/)开始,
被解释为相对于当前上下文根(context root)的路径。
例如:/myservlet是合法的路径,而../myservlet是不合法的路径。

ServletRequest.getRequestDispatcher(String path)方法的参数不但可以使相对于上下文根的路径,
而且可以是相对于当前Servlet的路径。如/myservlet和myservlet都是合法的路径。
如果路径以斜杠(/)开始,则被解释为相对于当前上下文根的路径;
如果没有以斜杠(/)开始,则被解释为相对于当前Servlet的路径。
  • JavaWEB四大域
1、context(代表整个应用都可以使用,servletContext)
2、request
3、session
4、page

如何读取web资源文件

  • Servlet方式
方式1:
InputStream in = this.getServletContext().getResourceAsStream("/WEB-INF/config/db.properties");
Properties props = new Properties();
props.load(in);

方式2:
String path= this.getServletContext().getRealPath("/WEB-INF/config/db.properties");
FileInputStream fis = new FileInputStream(path);
Properties props = new Properties();
props.load(fis);
  • 非Servlet方式(类装载器 只能加载classses目录下)
方式1(类加载器 加载与读)
InputStream in = UserServlet.class.getClassLoader().getResourceAsStream("db.properties");
Properties props = new Properties();
props.load(in);

方式2 (类加载器 只加载 用传统的方式读)
String path = UserServlet.class.getClassLoader().getResource("db.properties").getPath();
FileInputStream fis = new FileInputStream(path);
Properties props = new Properties();
props.load(fis);

javaweb读取配置文件的4种方法

输出中文乱码问题(2种方法)

  • 方法1:设置响应头
response.setHeader("Content-Type", "text/html;charset=utf-8");
  • 方法2:设置响应体
response.setHeader("Content-Type", "text/html");
String str = "中国";
OutputStream os = response.getOutputStream();
os.write("<meta charset=\"utf-8\" />".getBytes());
os.write(str.getBytes("utf-8"));
  • 注意事项
字符流字节流的区别(字节流是字符流的基础)
字节流应用更广泛:二进制数据(视频、音频、图片、文本)
字符流应用更专注:文本(字符串)

获取字节流:
OutputStream os = response.getOutputStream();
获取字符流:
PrintWriter pw = response.getWriter();

设置服务器编码方式:
字节: str.getBtyes("UTF-8") //告诉服务器使用UTF-8编码字符
字符: response.setCharacterEncoding("utf-8"); //告诉服务器使用UTF-8编码字符

设置客户端编码方式:
response.setContentType("text/html;charset=utf-8");

下载文件问题

  • 设置HTTP的头信息
response.setHeader("content-disposition", "attachment;filename=" + filename);

如果下载的是中文文件,上面这种写法会出行乱码并且下载不了,所以必须使用下面这种:
response.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(filename,"UTF-8"));

一、为什么要用URLEncoder

客户端在进行网页请求的时候,网址中可能会包含非ASCII码形式的内容,比如中文。

而直接把中文放到网址中请求是不允许的,所以需要用URLEncoder编码地址,

将网址中的非ASCII码内容转换成可以传输的字符

不会被编码的内容

1.大写字母A-Z

2.小写字母a-z

3.数字 0-9

4.标点符 - _ . ! ~ * ' (和 ,)

  • 读取资源文件到内存(只能获取文件真实路径)
String filePath = this.getServletContext().getRealPath("/WEB-INF/upload/xxx.jpg");
InputStream is = new FileInputStream(filePath);
  • 输出资源文件
OutputStream out = response.getOutputStream();
int len = 0;
byte[] buffer = new byte[1024];
while((len =is.read(buffer) ) > 0){
    out.write(buffer, 0 ,len);
}

JSP文件存放位置问题

如果需要先访问Servlet再跳转到Jsp的话,需要把JSP页面放在WEB-INF中

如果JSP可以直接访问,那直接放置在WEB-INF目录外层

104828720
1.4k 声望222 粉丝

编程其实很枯燥,所以一定要有追求。