req.getContextPath()作用
得到的是项目的虚拟路径:例如
访问路径为:http://localhost:8080/blue/response.jsp
request.getContextPath()得到的就是 /blue
JSP/Servlet中的相对路径和绝对路径
服务器端
相对地址指的是相对于你的web应用的地址,这个地址是在服务器端解析的
(不同于html和javascript中的相对地址,他们是由客户端浏览器解析的)也就是说这时候在jsp和servlet中的相对地址应该是相对于你的web应用,即相对于http://127.0.0.1/webapp/的。
请求转发:
//跳转页面
req.getRequestDispatcher("/WEB-INF/pages/store/company/update.jsp").forward(req, resp);
客户端
所有的html页面中的相对地址都是相对于服务器根目录(http://127.0.0.1/)的,
而不是(根目录下的该Web应用的目录)http://127.0.0.1/webapp/的。
请求重定向
//加个标记参数
//uri : /store/company?operation=list
@WebServlet("/store/company")
public class CompanyServlet extends BaseServlet {
}
//请求重定向 地址改变、不可以共享request、绝对路径
resp.sendRedirect(req.getContextPath() + "/store/company?operation=list");
${pageContext.request.contextPath}
是JSP取得绝对路径的方法,
等价于<%=request.getContextPath()%>
也就是取出部署的应用程序名或者是当前的项目名称
比如我的项目名称是demo1在浏览器中输入为http://localhost:8080/demo1/a.jsp ${pageContext.request.contextPath}或<%=request.getContextPath()%>
取出来的就是/demo1,而"/"代表的含义就是http://localhost:8080
故有时候项目中这样写${pageContext.request.contextPath}/a.jsp
include和iframe的区别
https://www.cnblogs.com/JolinChan/p/4039523.html
dao层的接口方法参数中为什么都要加上@Param注解
因为java没有保存行参的记录,java在运行的时候会把List queryAll(int offset,int limit);中的参数变成这样:queryAll(int arg0,int arg1),这样我们就没有办法去传递多个参数。所以需要使用@Param注解给方法参数命名,然后在xml文件的该dao层方法对应的sql语句中就可以正常使用@Param注解的参数名
param 和attribute的区别
相同 : 二者都是封装在request中
param: JSP-->Servlet [客户端]
属性是在后台servlet中设置并获取的 , 用方法setAttribute(name, o) 和 getAttribute(name)实现;
String getParameter(String name),即只能返回String类型数据。
没有setParameter()这一说。
attribute:Servlet-->Servlet/JSP [容器内]
参数主要是将前端页面标签携带的信息(标签的name作为参数名,标签的value作为参数值)作为参数(可以类似地看成在前端页面设置参数)往后台传递数据
void setAttribute(String name,Obejct o);
Object getAttribute(String name);
先在request中set,然后才能在request中get
https://www.zhihu.com/question/325301954/answer/690322222
session和request对象区别
转自https://blog.csdn.net/lameraaa/article/details/103384993
主要区别在于 生命周期不同
request
生命周期为一个请求,范围较小。
不需要声明,系统自动封装了,可以直接用。
存值:request.setAttribute(“名字”, 要存的值);
取值:request.getParameter(“名字”);
或者用EL表达式: ${名字}
session
生命周期为一次会话,一次会话内session存储的内容将一直存在。
声明:HttpSession session = request.getSession();
存值:session.setAttribute(“名字”, 要存的值);
取值:session.getAttribute(“名字”)
或者用EL表达式 ${sessionScope.所存值的对象 }
比较
request占用资源比较少,安全性比较高,但缺乏持续性。
session相对来说对资源的消耗会大点,安全性相对来说也会稍微低点,但它生命周期长。
如果可以使用request的情况下,尽量使用request ,因为相对于服务器来说资源的消耗还是比较重要的。
重定向和转发
(redirect)重定向的特点:
- 地址栏发生变化
- 重定向可以访问其他站点(服务器)的资源
- 重定向是两次请求。不能使用request对象来共享数据
(forward)转发的特点:
- 转发地址栏路径不变
- 转发只能访问当前服务器下的资源
- 转发是一次请求,可以使用request对象来共享数据
所以转发可以用request对象传值,重定向要用session对象传值
getContextPath、getServletPath、getRequestURI的区别
假定你的工程名称为projects,你在浏览器中输入请求路径:
1、request.getContextPath()
打印结果:/projects
2、request.getServletPath()
打印结果:/pages/newForm.jsp
3、request.getRequestURI()
打印结果 /projects/pages/newForm.jsp