WEB-INF目录
- WEB-INF目录下的资源是受保护的,在浏览器上不能通过路径直接访问,所以HTML,CSS,JS,image等一些静态资源一定放到WEB-INF之外。
ServletRequest接口
HttpServletRequest是一个接口,全限定名称:javax.servlet.http.HttpServletRequest
HttpServletRequest接口是Servlet规范中的一员
HttpServletRequest接口的父接口是ServletRequest
-
public interface HttpServletRequest extends ServletRequest {}
HttpServletRequest接口是谁实现的?HttpServletRequest对象是谁创建的?
-
通过测试:org.apache.catalina.connector.RequestFacade@17796a02 实现了HttpServletRequest接口
-
public class RequestFacade implements HttpServletRequest {}
-
测试结果:说明Tomcat服务器实现了 HttpServletRequest接口
HttpServletRequest对象中都包装了什么信息?
- HttpServletRequest是Tomcat服务器创建的,封装了Http请求协议的全部信息
- 实际上在用户发送请求时遵循了Http协议,发送的是Http请求协议,Tomcat服务器将Http协议中的数据和信息全部解析出来,然后Tomcat服务器将这些信息封装在HttpServletRequest对象中,传给了我们
- 对于我们来说,只需要面向HttpServletRequest接口调用方法即可
request和response对象的生命周期?
- request和response对象的生命周期极短
- 一次请求/响应 对应一个request/response 只在一次请求,响应中有效
HttpServletRequest对象中有哪些常用方法?这些方法可以完成哪些功能?
-
怎么获取前端浏览器用户提交的数据?
-
//四个常用方法 String getParameter(String name) //获取key对应的value集合中的第一个元素,大部分前端提交的数据都是Key,Value 一对一关系,这个方法最常用 Map<String,String[]> getParameterMap() //获取Map为什么是String[]? //因为用户表单提交的数据可能一个key对应多个value Enumeration<String> getParameterNames() //获取Map集合中的key String[] getParameterValues(String var1)//根据Key值获取对应的Value集合对象,需要循环遍历输出 //以上的四个方法,和获取用户提交的数据有关 //其他常用方法 String getRemoteAddr();//获取客户端的IP地址、 RequestDispatcher getRequestDispatcher();//请求转发器,用来跳转
-
前端form表单提交了数据之后,用什么来存储这个数据?
前端提交的数据:username=122&password=12&sex=1&hobby=s&hobby=d
-
Map<String,String> key value ----------------------------------- username 122 password 12 sex 1 hobby s hobby d --------------------------------------------- //以上这种存储方式有问题,当key一样时,键值会覆盖 //采用这种Map<String,String[]>类型来存储最合适 Map<String,String[]> key value ------------------------------------------ username {"122"} password {"12"} sex {"1"} hobby {"s","d"}
-
-
-
应用域对象是什么?
-
ServletContext(Servlet上下文对象)
-
什么时候会考虑向ServletContext这个应用域当中绑定数据?
-
1,所以用户共享的数据
-
2,这个共享的数据量很小
-
3,这个共享的数据很少的修改操作
-
以上三个条件都满足的情况下,使用应用域对象,可以大大的提高程序的执行效率
-
实际上向应用域中绑定数据,就相当于把数据放在了缓存中,然后用户在访问数据时,直接从缓存中取,减少了IO操作,提高系统性能。
-
-
ServletContext当中有三个操作域的方法:
-
void setAttribute(String name,Object obj);//向域中绑定数据 Object getAttribute(String name);//向域中获取数据 void removeAttribute(String name);//将域中绑定的数据移除
-
-
-
“请求域”对象
-
”请求域“对象比“应用域”对象范围小很多,生命周期短很多,只在一次请求内有效
-
一个请求对象request对应一个请求域对象,一次请求结束后这个请求域就销毁了
-
请求域对象也有这三个方法:
-
void setAttribute(String name,Object obj);//向域中绑定数据 Object getAttribute(String name);//向域中获取数据 void removeAttribute(String name);//将域中绑定的数据移除
-
-
请求域和应用域的选用原则?
- 尽量使用小的域对象,小的域对象占用的资源较少
-
-
有哪些缓存技术?
-
字符串常量池
-
整数型常量池[-128---127],(只要是在这个范围当中的Interger对象不在创建,直接从这个整数型常量池获取)
-
数据库连接池(提前创建N个连接对象,将连接对象放在集合中,使用连接对象时,直接从缓存中取,省去了连接对象的操作,提升效率)
-
线程池(Tomcat服务器是支持多线程的,提前创建好N个线程对象,将线程对象放在集合中,当用户请求过来后,直接从线程池中获取线程对象,直接拿来用,提升系统性能)
-
-
跳转(转发)
-
转发(一次请求)
-
当想要在AServelet调用BServlet时,如果自己创建BServlet则这个Servlet是不受服务器管理的,是一个占用资源的违法程序
-
比如: BServlet servlet = new Bservlet(); servlet.doGet(request,response); -------------------------------------- //上述的解决方法存在问题 //一般用到转发机制,这种机制可以被服务器识别 //第一步:获取请求转发器对象,传入请求路径 RequestDispatcher dispatcher = request.getRequestDispatcher("/b"); //第二步:调用转发器的forward方法完成转发 dispatcher.forward(request,response); //第一步和第二步合并在一起,实际上是把下一个资源的跳转路径告知给Tomcat服务器,并且调用其方法 request.getRequestDispatcher("/b").forward(request,response);
-
-
当两个Servlet需要共享数据时可以将共享的数据放在request请求域对象中,再使用转发机制,保证AServlet和BServlet在同一次请求中,这样就可以实现两个Servlet对象的数据共享。当然也可以放在ServletContext应用域对象中,只是这样范围太大,占用资源。
-
转发机制不仅可以转发动态的Servlet资源,也可以转发静态的html资源,只要是WEB容器中的合法资源都可以转发。
-