说说Java生态圈的那些事儿

发表于:2015-8-04 09:17

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:RunforLove    来源:51Testing软件测试网采编

  Web应用何时被启动:
  1,当Servlet容器启动的时候,所有的Web应用都会被启动
  2,控制器启动web应用
  Servlet与JSP的比较:
  有许多相似之处,都可以生成动态网页。
  JSP的优点是擅长于网页制作,生成动态页面比较直观,缺点是不容易跟踪与排错。
  Servlet是纯Java语言,擅长于处理流程和业务逻辑,缺点是生成动态网页不直观。
  对于文中说到的,Servlet生成动态网页不直观。servlet可以用于生成动态的Web页内容。但是,它的一个缺点是必须将HTML标记和文本嵌入到Java源代码中。这样,如果要改变静态的HTML文本,必须修改Java源代码并重新进行编译。同时,在servlet中有许多静态HTML代码和一些动态HTML代码混在一起,由于正常的HTML代码是Java源代码的一部分,所以很难阅读和维护这些代码。JSP就是为了克服上述缺点而引入的。
  编辑文件:CurrentTime.jsp如下所示:
  <html>
  <head>
  <title>CurrentTime</title>
  </head>
  <body>
  CurrentTime is <%= new java.util.Date()%>
  </body>
  </html>
  将程序放到tomcat容器下运行。
  5. 继续探究Servlet,Servlet本身是单实例的,这样当多个用户同时访问某个Servlet时,会访问该唯一的Servlet实例中的成员变量,如果对成员变量进行写入工作,那就会导致Servlet的多线程问题,即数据不一致。
  解决Servlet多线程同步问题的方案:
  1,Servlet实现了javax.servlet.singleThreadModel(Servlet2.4中已经废弃该接口),此时的Servlet容器将保证Servlet实例是以单线程的方式运行,也就是说同一时刻,只会有一个线程运行Servlet的service()方法。   不推荐使用,大大降低了效率。
  2,去除实例变量,使用局部变量  推荐
  3,使用同步代码块 synchronized{...}  不推荐使用
  6. Cookie的英文原意是“点心”,当用户访问WEB服务器时,服务器在用户硬盘上存放的信息,好像是服务器送给用户的点心。服务器可以根据Cookie来跟踪用户,这对于需要区别用户场合特别有用。先来看看我们在HTML5项目中使用过的cookie具体案例:
  这个是在H5/js/common.js中的两个函数。
//保存到cookie
function setCookie(name,value,days)
{
var exp = new Date();
exp.setTime(exp.getTime() + days*24*60*60*1000);
document.cookie = name + "="+ escape (value) + ";expires=" + exp.toGMTString();
}
//读取cookies
function getCookie(name)
{
var arr,reg=new RegExp("(^| )"+name+"=([^;]*)(;|$)");
if(arr=document.cookie.match(reg))
return unescape(arr[2]);
else
return null;
}
  两个函数,分别用来设置cookie和取得cookie。
  setTimeout(function() {
  var cookieChid=getCookie('chid');
  if(cookieChid !='w5')
  {
  $("#underonlaodFlag").attr("style","display:display");
  }
  },300);
  在其他页面中,通过这段JS,延迟300ms执行,保证先加载了common.js, 再执行这段JS。做出判断。
  var uid=getCookie('uid')==null?'':getCookie('uid');  //这个同样是其他页面需要使用cookie的案例。
  继续来读代码
public class CookieServlet extends HttpServlet
{
private int count1;
private int count2;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
{
Cookie cookie = new Cookie("cookiename"+ count1++,"cookievalue"+ count2++);
cookie.setMaxAge(10);//设置存活时间  单位秒
resp.addCookie(cookie);
Cookie[] cookies = req.getCookies();
if(null == cookies)
{
return;
}
for(Cookie cookie2:cookies)
{
System.out.println(cookie2.getName());
System.out.println(cookie2.getValue());
}
}
}
//代码中展现了:Servlet 中创建、存储和接收客户端存储Cookie的过程。
  7. 客户端的cookie都有生命周期的,一般为两周。又或者用户主动清空了自己的cookie,那么服务器怎么来跟踪用户记录呢?Session回话,Session用于跟踪客户的状态,Session是指在一段时间内,单个客户与WEB服务器一连串相关的交互过程。在一个Session中,客户可能多次请求访问同一个网页,也有可能请求访问各种不同的服务器资源。
  Web服务器跟踪客户状态通常有四种方法:
  1,建立含有跟踪数据的隐藏字段  type=hidden
  2,重写包含额外参数的URL
  3,使用持续的Cookie
  4,使用Servlet API中的Session(会话)机制
  Session的生命周期:
  当客户第一次访问WEB应用中支持Session的某个页面时,就会开始一个新的session
  接下来客户访问这个WEB应用中不同的网页时,都处于同一个session中
  默认情况下,JSP页面是支持Session的,如果想不支持Session,可使用标签<%@ page session="false"%>
  在下列情况下,Session将结束生命周期,Servlet容器将释放HttpSession占用的资源:
  1,客户浏览器关闭?
  2,Session过期
  3,服务器端调用了HttpSession的Invalidate()方法
  如何做到在浏览器关闭时删除Session?
  严格的讲,做不到这一点。可以做的努力的办法是在所有的客户端页面里使用javascript的方法window.onclose来监视浏览器的关闭动作,然后向服务器发送一个请求来删除Session;
  但是对于浏览器崩溃或强行杀死进程这种非常规手段仍然无能为力。
  实际上我们在项目中也不会这么做,而是让服务器在Session过期时将其删除。
  Session运行机制:
  当一个Session开始时,Servlet容器将创建一个HttpSession对象,在HttpSession对象中可以存放客户的状态信息(例如购物车)。
  Servlet容器为HttpSession分配一个唯一标志符,称为SessionID。Servlet容器将SessionID作为Cookie保存在客户的浏览器中。
  每次客户发送Http请求时,Servlet容器可以从HttpServletRequest对象中读取SessionID,然后根据SessionID找到对应的HttpSession对象,从而获取客户的状态信息。
  Session的接口HttpSession:
  getId()   返回session的ID
  Invalidate()  让当前session失效,Servlet容器会释放HttpSession对象占用的资源
  getAttribut()     setAttribute()
  isNew()  判断是否是新创建的session,如果是返回true 否则返回false
  setMaxInactiveInterval()  设置session的最大有效时间 单位为秒 如果设置为负数,表示不限制session处于不活动状态的最大有效时间,默认的设置时间为30分钟
  8. 说完了Servlet,来到了我们常用的框架中是怎么拦截过滤Servlet的。那就说到了Servlet的过滤器Filter。
  Servlet过滤器是在Java Servlet规范2.3中定义的,它能够对Servlet容器的请求和响应对象进行检查和修改。Servlet过滤器本身不生成请求和响应对象,它只提供过滤作用。Servlet过滤器能够在Servlet被调用之前检查Request对象,修改Request Header和Request内容。在Servlet被调用后检查Response Header和Response内容,Servlet过滤器负责过滤WEB的组件可以是Servlet,JSP和HTML。
  Filter接口:
  每一个Servlet过滤器都会实现javax.serlvet.Filter接口,这个接口中含有三个过滤方法必须实现:
  init(FilterConfig):这是Servlet过滤器的初始化方法,Servlet容器创建Servlet过滤器后将调用这个方法,在这个方法中可以读取web.xml中Servlet过滤器的初始化参数
  doFilter(ServletRequest,ServletResponse,FilterChain):这个方法完成实际的过滤操作。当客户请求访问与过滤器关联的URL的时候,Servlet过滤器将先执行doFilter方法。FilterChain参数用于访问后续过滤器。
  destroy():Servlet容器在销毁过滤器实例前调用这个方法,在这个方法中可以释放Servlet过滤器占用的资源。
  我们可以看一段使用struts框架中的过滤器的实例是怎么操作的。
  //这个是在web.xml中使用struts2的过滤器的配置文件,
  <filter>
  <filter-name>struts2</filter-name>
  <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
  </filter>
  <filter-mapping>
  <filter-name>struts2</filter-name>
  <url-pattern>/*</url-pattern>
  </filter-mapping>
32/3<123>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号