通过一段时间的学习,对于Servlet有了新的不同的看法,在这里作一下总结,将近来学习到的知识总结一下。html
浏览器发出请求:http://localhost:80/xxx1/xxx2 (80端口能够默认不写,由于这是http协议默认的端口,平时咱们访问https://www.baidu.com/ 时其实访问的是https://www.baidu.com:80/)java
<Context docBase="D:\javaPros\test\webapp" path="xxx1" />
<Context />
元素的 path属性 属性为 xxx1
<Context />
元素,获得docBase
属性,获取当前访问 Web 项目的跟的绝对路径:D:\javaPros\test\webapp
D:\javaPros\test\webapp
下的 WEB-INF 下找到 web.xml 文件<url-pattern>
的文本内容为 /xxx2
Map<String,Servlet> cache = ......(Tomcat提供的); key:存Servlet类的全限定名称 value:该Servlet类的对象. Servlet obj = cache.get("xxx.xxx"); if(obj==null){ //Servlet实例缓存中没有该类的对象,第一次. GOTO 6: }else{ //有对象,非第一次. GOTO 8: } }
使用反射调用构造器,建立对应的对象
obj = Class.forName("xxx.xxx").newInstance();
把当前建立的 Servlet 对象,存放在缓存之中,供给下一次的使用.
cache.put("xxx.xxx",obj);
git
建立 ServletConfig 对象,并调用 init() 方法
obj.init(config);
github
建立 ServletRequest 对象和 ServletResponse 对象,并调用 service()方法
obj.service(req,resp);
web
在 service() 方法中对浏览器做出响应操做。设计模式
在 Web 容器中,Servlet 主要经历 4 个阶段,以下图:
跨域
这一部分参考文章:这里是连接数组
前面的文章里面提到过,广义上,Servlet 即实现了 Servlet 接口 的类,当咱们建立一个自定义类,实现 Servlet 接口 的时候,会发现有 5 个方法须要重写,有init【初始化】,destroy【销毁】,service【服务】,ServletConfig【Servlet配置】,getServletInfo【Serlvet信息】。浏览器
这样作的话,咱们每次都须要实现 5 个方法,太麻烦了!缓存
咱们能够直接继承 HttpServlet 类,该类已经默认实现了 Servlet 接口中的全部方法,在编写 Servlet 的时候,你只须要重写你须要的方法就行了,而且该类还在原有 Servlet 接口上添加了一些与 HTTP 协议处理相关的方法,比 Servlet 接口的功能更强大。
this.doPost(req, resp);
(由于不管是get或post请求提交的数据,处理方式都基本相同,下同)this.doGet()(req, resp);
浏览器屡次对Servlet的请求,通常状况下,服务器只建立一个Servlet对象,也就是说,Servlet对象一旦建立了,就会驻留在内存中,为后续的请求作服务,直到服务器关闭。
对于每次访问请求,Servlet引擎都会建立一个新的HttpServletRequest请求对象和一个新的HttpServletResponse响应对象,而后将这两个对象做为参数传递给它调用的Servlet的service()方法,service方法再根据请求方式分别调用doXXX方法。
当多个用户访问Servlet的时候,服务器会为每一个用户建立一个线程。当多个用户并发访问Servlet共享资源的时候就会出现线程安全问题。
原则:
1. 若是一个变量须要多个用户共享,则应当在访问该变量的时候,加同步机制synchronized (对象){}
2. 若是一个变量不须要共享,则直接在 doGet() 或者 doPost()定义.这样不会存在线程安全问题
对于每次访问请求,Servlet引擎都会建立一个新的HttpServletRequest请求对象和一个新的HttpServletResponse响应对象,即 request 和 response 对象。
既然 request 对象表明 http 请求,那么咱们获取浏览器提交过来的数据,就找 request 对象 便可。response 对象表明 http 响应,那么咱们向浏览器输出数据,找 response 对象便可。
resp.setContentType("text/html;charset=utf-8");
要知道,GET 和 POST 都是请求方式
http://localhost/test.html
?name=wmyskxz&sex=malename
属性值为wmyskxz
,另外一个是sex
属性值为male
,这是一种直接的请求方式,在请求资源后面跟上 ? 符号与参数链接,其余的参数使用 & 符号链接。缺点:
1.暴露请求信息,不安全
2.请求信息不能超过1kb,可传输的信息有限,不能上传图片
http://localhost/test.html#
优势:
1.隐藏了请求信息,较安全(但仍能够经过相关工具访问到数据)
2.POST 方式没有限制请求的数据大小,能够作图片的上传
但并非全部的数据都须要使用 POST 请求来完成,事实上,GET 请求方式会比 POST 请求更快,当数据小而且安全性要求不是那么高的时候,GET 仍然是很好的选择.(而且 GET 相较 POST 简单)
在 Tomcat 服务器中,接受请求的时候,默认的编码方式为 ISO-8859-1,而该编码方式只占一个字节,不支持中文(两个字节),因此当咱们作请求的时候,会出现乱码的问题
byte[] data = name.getBytes("ISO-8859-1");
name = new String(data,"UTF-8");
request.setCharacterEncoding("UTF-8");
Tomcat根目录/conf/server.xml(修改端口的那一行)
<url-pattern>
,可使用多个资源名称找到当前的 Servlet*
表示任意字符/*
:可使用任意的字符访问当前的 Servlet*.xxx
:如 wmyskxz.wudi<servlet-name>
不可以为 default ,使用它会形成项目下面的静态资源找不到,在 Tomcat/conf/web.xml
文件中配置一个名字为default的Servlet,该Servlet在负责访问项目下的静态资源这是 Servlet 3.0 提出的新特性,支持注解配置,这大大简化了咱们的工做。
在以前的开发工做中,咱们老是去 web.xml
文件中进行配置,至少会出现8行:
而当一个项目中存在不少 Servlet ,那么配置文件就会变得很是臃肿,不便于后期的维护,在 Servlet 3.0 推出以后,咱们可使用注解来配置 Servlet,上面 8 行的配置能够简化为下面的简单的注解:
或者也可使用属性 value
定义访问的 URL,只有 URL 这个属性是必要的,name
是能够缺省的值,而默认的 value
也能够省略不写,因此能够简写成:
@WebServlet("/foreServlet")
又叫作直接转发方式,客户端和浏览器只发出一次请求,Servlet、HTML、JSP或其它信息资源,由第二个信息资源响应该请求,在请求对象request中,保存的对象对于每一个信息资源是共享的。
好比:从 AServlet 请求转发到 BServlet
request.getRequestDispatcher(path).forward(request, response);
参数:path
,要跳转到的资源路径:上下文路径 / 资源路径
request.setAttribute(String var1,Object var2)
设置要共享的数据资源,并经过request.getAttribute(String var1);
来获取传递的资源又叫作间接转发方式(Redirect)实际是两次HTTP请求,服务器端在响应第一次请求的时候,让浏览器再向另一个URL发出请求,从而达到转发的目的。
好比:从AServlet重定向到BServlet
response.sendRedirect(String location);
参数:location
,转发到的资源路径
MVC 是一种分层的设计模式 。
这部分能够参考一下这里
欢迎转载,转载请注明出处!
简书ID:@我没有三颗心脏
github:wmyskxz 欢迎关注公众微信号:wmyskxz_javaweb 分享本身的Java Web学习之路以及各类Java学习资料