1、什么是监听器

监听器是实现一个特定的接口java规划,该计划的目的是还调用类方法监听器。java的awt大量使用该模式,如的能力button点击事件。当鼠标点击时,就会调用事件处理程序。又如:在javascript事件中也运用到了此种模式。当用户点击鼠标时。会触发一个鼠标点击事件去调用程序猿定义的事件处理程序。以下就以GUI编程来说明监听器。监听器都使用到了观察者模式,观察者模式所定义的对象间一对多的依赖关系,当一个对象的状态发生改变时,全部依赖他的对象都会得到通知自己主动更新。

package cn.zq.demo;

import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener; import javax.swing.JButton;
import javax.swing.JFrame; public class DemoFrame extends JFrame{ /**
*
*/
private static final long serialVersionUID = -7552482706279772458L; public DemoFrame() {
JButton button = new JButton("点击试试"); System.out.println("button ->" + button.hashCode()); //设置默认的关闭操作:关闭时退出程序
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //给button加入一个监听器
button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) {
System.out.println("监听到了 ->"+e.getSource().hashCode());
}
}); //拿到容器
Container container = getContentPane();
//设置为流式布局
container.setLayout(new FlowLayout());
container.add(button); setSize(200, 100);
setVisible(true);
} public static void main(String[] args) {
new DemoFrame();
}
}

用button.addActionListener方法给按钮加入了一个监听器,当用户点击鼠标时,监听器中的actionPerformed(ActionEvent e)方法就会被运行。传过来的參数ActionEvent对象包括了当前正在被监听的对象。

监听器存在下面三个类:

  • 监听者:XxxxListener,是一个接口,里面会定义一个或若干方法。当被监听者触发某个动作时被运行。相当于一个回调函数
  • 被监听者:随意的对象都能够被监听。上面的被监听者就是button
  • 监听到的事件:XxxEvent,它永远都是一个详细类。用来存放数据,一般都会有一个getSource()方法,用来获取监听到的对象,还会提供一些其它的方法来获取相关的信息

1.1、编写一个观察者模式演示样例

被监听Person

package cn.zq.demo;

public class Person {

	private PersonListener l;

	public void addPersonListener(PersonListener l){
this.l = l;
} public void run() { //先运行监听器对象方法
if(l != null){
//传递事件源对象
l.run(new PersonEvent(this));
}
System.out.println("Person->"+this + "->run...");
}
}

监听器PersonListener

package cn.zq.demo;

public interface PersonListener {

	void run(PersonEvent e);
}

监听到的事件PersonEvent

package cn.zq.demo;

public class PersonEvent {

	private Object src;

	//构造事件对象时把被监听对象传进来
public PersonEvent(Object src) {
this.src = src;
} public Object getSource(){
return src;
}
}

測试类:

package cn.zq.demo;

public class Main {

	public static void main(String[] args) {
Person p = new Person();
p.addPersonListener(new PersonListener() { public void run(PersonEvent e) {
System.out.println("event->"+e.getSource() + "->run....");
}
}); //触发用户的run方法
p.run();
}
}

当调用Person.run()方法时,首先会运行PersonListener.run()方法,再调用时会将PersonEvent事件对象传递进来,这个对象包括了当前的Person对象。

2、servlet监听器

在javaweb中主要监听这三个对象:ServletContext. HttpSession, ServletRequest,

基本的监听器例如以下表:

2.1、监听HttpServletRequest的创建个销毁

第一步:创建一个类,这个类实现ServletRequestListener

package cn.zq.listener;

import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener; public class RequestListener implements ServletRequestListener{
    
    public void requestInitialized(ServletRequestEvent e) {
        System.out.println("request创建了!");
        System.out.println("这个request是"+e.getServletRequest());
    }
    
    public void requestDestroyed(ServletRequestEvent e) {
        System.out.println("request销毁了!");
        System.out.println("这个request是"+e.getServletRequest());
    } }

第二步:在web.xml文件里配置

  <listener>
<listener-class>cn.zq.listener.RequestListener</listener-class>
</listener>

第三步:部署,启动tomcat。查看结果

request创建了!
这个request是org.apache.catalina.connector.RequestFacade@19845fb
request销毁了!
这个request是org.apache.catalina.connector.RequestFacade@19845fb

注意:配置listener时仅仅需提供一个类名即可了。tomcat启动时会依据其类型自己主动的载入。和Servlet, Filter一样,Listener也是单例的,也就是在tomcat容器中仅仅会载入一次。

2.2、记录站点的在线人数

分析:仅仅要有人訪问,创建一个session就是一个会话,一个会话就是一个在线人数。所以须要监听session的创建和销毁。

第一步:编写一个类实现HttpSessionListener接口

package cn.zq.listener;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener; public class MyHttpSessionListener implements HttpSessionListener{ public void sessionCreated(HttpSessionEvent e) {
System.out.println("有人訪问本网站了...");
HttpSession session = e.getSession();
System.out.println("session->"+session+"("+session.getId()+")");
ServletContext sc = session.getServletContext();
Integer onlineCount = (Integer) sc.getAttribute("onlineCount");
if(onlineCount == null){
onlineCount = 0;
}
sc.setAttribute("onlineCount", ++onlineCount);
} public void sessionDestroyed(HttpSessionEvent e) {
System.out.println("有人退出了 ->"+e.getSession().getId());
ServletContext sc = e.getSession().getServletContext();
Integer onlineCount = (Integer) sc.getAttribute("onlineCount");
if(onlineCount != null && onlineCount > 0){
sc.setAttribute("onlineCount", --onlineCount);
}
} }

第二步:在web.xml文件里配置

  <listener>
<listener-class>cn.zq.filter.MyHttpSessionListener</listener-class>
</listener>

第三步:在jsp文件里增加:

<p>在线人数:${applicationScope.onlineCount }</p>

为了能让測试快点看到效果,应该在web.xml文件里配置session存活的时间:

  <session-config>
<!-- 分钟 -->
<session-timeout>1</session-timeout>
</session-config>

2.3、监听session属性的变化(HttpSessionAttributeListener)

第一步:编写一个类实现HttpSessionAttributeListener

package cn.zq.listener;

import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent; /**
* 监听session属性变化
* @author zq
*
*/
public class SessionAttributeListener implements HttpSessionAttributeListener{ /**
* 属性被加入后运行此方法
*/
public void attributeAdded(HttpSessionBindingEvent event) {
System.out.println("加入session属性");
HttpSession session = event.getSession();
System.out.println("session ->" + session);
//属性名
String name = event.getName();
//属性值
Object value = event.getValue();
System.out.println(name + "=" + value);
} /**
* 属性被移除时运行这种方法
*/
public void attributeRemoved(HttpSessionBindingEvent event) {
System.out.println("移除session属性");
HttpSession session = event.getSession();
System.out.println("session ->" + session);
//属性名
String name = event.getName();
//属性值
Object value = event.getValue();
System.out.println(name + "=" + value);
} public void attributeReplaced(HttpSessionBindingEvent event) {
System.out.println("替换session属性");
HttpSession session = event.getSession();
System.out.println("session ->" + session);
//属性名
String name = event.getName();
//属性值
Object value = event.getValue();
System.out.println("替换前:"+name + "=" + value);
System.out.println("替换后:"+name + "=" + session.getAttribute(name));
} }

第二步:在web.xml中配置这个监听器

  <listener>
<listener-class>cn.zq.listener.SessionAttributeListener</listener-class>
</listener>

第三步:測试

    <%
session.setAttribute("name", "RiccioZhang");
session.setAttribute("name", "zq");
session.removeAttribute("name");
%>
加入session属性
session ->org.apache.catalina.session.StandardSessionFacade@1a8739b
name=RiccioZhang
替换session属性
session ->org.apache.catalina.session.StandardSessionFacade@1a8739b
替换前:name=RiccioZhang
替换后:name=zq
移除session属性
session ->org.apache.catalina.session.StandardSessionFacade@1a8739b
name=zq

2.4、小案例

(1)显示登录人数

(2)显示登录人的ip,session的创建时间、最后訪问时间

(3)能够踢出某个用户

分析:仅仅要有人登录(输入了username)就会放到session中,Session.setAttribute("user", "zq");

实现第一个核心类:

package cn.zq.listener;

import java.util.HashMap;
import java.util.Map; import javax.servlet.ServletContext;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent; public class MySessionAttrListener implements HttpSessionAttributeListener{ public void attributeAdded(HttpSessionBindingEvent event) {
String name = event.getName();
if("user".equals(name)){
ServletContext sc = event.getSession()
.getServletContext(); //将session缓存到map中
@SuppressWarnings("unchecked")
Map<String, HttpSession> m = (Map<String, HttpSession>) sc.getAttribute("login");
if(m == null){
m = new HashMap<String, HttpSession>();
sc.setAttribute("login", m);
}
m.put(event.getSession().getId(), event.getSession());
}
} public void attributeRemoved(HttpSessionBindingEvent event) {
String name = event.getName();
if("user".equals(name)){
HttpSession session = event.getSession();
ServletContext sc = session.getServletContext(); @SuppressWarnings("unchecked")
Map<String, HttpSession> m = (Map<String, HttpSession>) sc.getAttribute("login");
if(m != null){
m.remove(session.getId());
}
}
} public void attributeReplaced(HttpSessionBindingEvent event) {} }

配置:

  <listener>
<listener-class>cn.zq.listener.MySessionAttrListener</listener-class>
</listener>

开发登录,退出功能:

(1)登录页面

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>主页</title>
</head> <body>
<c:choose>
<c:when test="${empty sessionScope.user}">
<form action="<c:url value='/Login'/>" method="post">
<input type="text" name="name"><br/>
<input type="submit" >
</form>
</c:when>
<c:otherwise>
欢迎您,${sessionScope.user }<br/>
<a href="<c:url value='/Login'/>">退出</a><br/>
</c:otherwise>
</c:choose>
<a href="<c:url value='/ShowServlet'/>">显示全部登录人数</a>
</body>
</html>

(2)开发处理登录、退出的servlet

package cn.zq.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 3059445154848670189L; public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.getSession()
.removeAttribute("user");
response.sendRedirect(request.getContextPath() + "/index.jsp");
} public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
String name = request.getParameter("name");
request.getSession().setAttribute("user", name);
request.getSession().setAttribute("ip", request.getRemoteAddr());
response.sendRedirect(request.getContextPath() + "/index.jsp");
} }

配置:

  <servlet>
<servlet-name>ShowServlet</servlet-name>
<servlet-class>cn.zq.servlet.ShowServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/Login</url-pattern>
</servlet-mapping>

开发转换登录人集合数据的servlet和显示登录人信息的页面

(1)获取登录人集合并将其转换成一个MapList。将封装好的信息传递到显示页面

package cn.zq.servlet;

import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry; import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession; public class ShowServlet extends HttpServlet { /**
*
*/
private static final long serialVersionUID = 8867391453104991999L; public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { doPost(request, response);
} public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
ServletContext sc = getServletContext();
@SuppressWarnings("unchecked")
Map<String, HttpSession> m = (Map<String, HttpSession>)
sc.getAttribute("login");
List<Map<String, Object>> list = new ArrayList<Map<String,Object>>();
if(m != null){
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
for(Iterator<Map.Entry<String, HttpSession>> it = m.entrySet().iterator();
it.hasNext();){
Entry<String, HttpSession> entry = it.next();
Map<String, Object> mapBean = new HashMap<String, Object>();
mapBean.put("sessionid", entry.getKey());
mapBean.put("user", entry.getValue().getAttribute("user"));
mapBean.put("creationTime", df.format(new Date(entry.getValue().getCreationTime())));
mapBean.put("lastAccessTime", df.format(new Date(entry.getValue().getLastAccessedTime())));
mapBean.put("ip", entry.getValue().getAttribute("ip"));
list.add(mapBean);
}
} request.setAttribute("list", list);
request.getRequestDispatcher("/page/show.jsp")
.forward(request, response);
} }

(2)显示页面取出数据显示

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>显示登录人数</title>
</head>
<body>
<p>欢迎您:<c:out value="${user }"></c:out>,共${fn:length(list) }人。下面是全部登录人数:</p>
<table border="1">
<tr>
<th>姓名</th>
<th>登录时间</th>
<th>最后訪问时间</th>
<th>登录ip</th>
<th>操作</th>
</tr>
<c:forEach items="${list}" var="m">
<tr>
<td>${m.user}</td>
<td>${m.creationTime}</td>
<td>${m.lastAccessTime}</td>
<td>${m.ip}</td>
<td>
<a href="<c:url value='/KickupServlet? id=${m.sessionid }'/>">踢出</a>
</td>
</tr>
</c:forEach>
</table>
</body>
</html>

开发第二个核心类,实现将用户踢出的功能

package cn.zq.servlet;

import java.io.IOException;
import java.util.Map; import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession; public class KickupServlet extends HttpServlet { private static final long serialVersionUID = 1007302413238302848L; public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { doPost(request, response);
} public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String id = request.getParameter("id");
ServletContext sc = getServletContext();
Map<String, HttpSession> login = (Map<String, HttpSession>) sc.getAttribute("login"); HttpSession session = login.get(id);
if(session != null){
session.removeAttribute("user");
}
login.remove(id);
response.sendRedirect(request.getContextPath() + "/ShowServlet");
} }

配置:

 <servlet>
<servlet-name>KickupServlet</servlet-name>
<servlet-class>cn.zq.servlet.KickupServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>KickupServlet</servlet-name>
<url-pattern>/KickupServlet</url-pattern>
</servlet-mapping>

完毕以上步骤,并測试自己写的程序。

2.5、ServletContextListener用于监听ServletContext的创建和销毁

这个监听器非常实用,比方能够在web容器启动的是否载入一些配置文件,运行一些初始化操作,web容器停止时,运行一些清楚操作。spring就是使用监听器在web容器启动时运行初始化的。

ServletContextListener有2个方法:

  • void contextInitialized(ServletContextEvent sce) 此方法在web容器启动时运行
  • void contextDestroyed(ServletContextEvent sce)此方法在web容器正常停止时运行

做一个案例:开发一个显示站点的訪问次数的小功能

分析:应该将訪问次数存放到servletContext中,为了避免訪问次数的丢失。应当将server停止时将訪问次数放到文件里保存,server启动时再从文件里读取,这个操作应当在ServletContextListener监听器中做。

用户每发送一次请求就算是一次訪问,记录訪问次数的添加,能够再过滤器中做。也能够在ServletRequestListener中做(创建一个request对象就是一次訪问),由于在学习监听器,所以我选择后者。

(1)开发一个ServletContextListener和一个ServletRequestListener

package cn.zq.listener;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException; import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener; public class MyServletContextListener implements ServletContextListener{ public void contextInitialized(ServletContextEvent sce) {
System.out.println("ServletContext:"+sce.getServletContext()+"->init...");
String path = MyServletContextListener.class.getClassLoader().getResource("vist.txt").getFile();
try {
BufferedReader br = new BufferedReader(new FileReader(path));
String line = br.readLine();
long vistCount = 0;
if(line != null && line.length() > 0){
vistCount = Long.parseLong(line);
}
sce.getServletContext().setAttribute("vistCount", vistCount);
System.out.println("初始化的訪问次数:"+vistCount);
br.close();
} catch (IOException e) {
e.printStackTrace();
}
} public void contextDestroyed(ServletContextEvent sce) {
System.out.println("ServletContext:"+sce.getServletContext()+"->destroy...");
String path = MyServletContextListener.class.getClassLoader().getResource("vist.txt").getFile();
try {
FileWriter fw = new FileWriter(path);
Long vistCount = (Long) sce.getServletContext()
.getAttribute("vistCount");
if(vistCount != null){
fw.write(vistCount.toString());
}
fw.close();
} catch (IOException e) {
e.printStackTrace();
} } }
package cn.zq.listener;

import javax.servlet.ServletContext;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener; public class RequestListener implements ServletRequestListener { public void requestInitialized(ServletRequestEvent e) {
System.out.println(e.getServletRequest()+"->创建了");
ServletContext sc = e.getServletContext();
Long vistCount = (Long) sc.getAttribute("vistCount");
if(vistCount == null){
vistCount = 0L;
}
sc.setAttribute("vistCount", ++vistCount);
} public void requestDestroyed(ServletRequestEvent e) {
System.out.println(e.getServletRequest() + "->销毁了");
}
}

配置:

 <listener>
<listener-class>cn.zq.listener.RequestListener</listener-class>
</listener>
<listener>
<listener-class> cn.zq.listener.MyServletContextListener</listener-class>
</listener>

(2)从jsp页面获取訪问次数。測试tomcat正常停止后,再次启动能否读取到曾经 訪问次数。

2.6、HttpSessionBindingListener--用于监听一个对象是否被绑定到session中

要监听一个对象是否被绑定到了session对象中。这个对象须要实现HttpSessionbindingListener这个接口,注意:仅仅须要实现这个接口,不须要配置到web.xml文件里。

(1)先开发一个Person类实现这个接口

package cn.zq.domain;

import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener; public class Person implements HttpSessionBindingListener{ public void valueBound(HttpSessionBindingEvent event) {
String name = event.getName();
Object value = event.getValue();
System.out.println(value+"被绑定到session中了");
System.out.println(name + "=" + value);
} public void valueUnbound(HttpSessionBindingEvent event) {
System.out.println(event.getValue()+"从session中解绑了");
} }

(2)在jsp中增加例如以下代码

    <%
Person p = new Person();
session.setAttribute("p", p);
session.removeAttribute("p");
%>

(3)測试。并查看结果

这个监听器用处并不大,使用了这个监听器。那么javabean就与这个接口耦合起来了,添加了耦合度,那么意味着这个javabean就必须依赖servel api而存在,没有了就会出现错误

2.7、HttpSessionActivationListener--监听对象的活化和钝化

实现此接口的javabean能够感知活化(从硬盘到内存)或钝化(从内存到硬盘)的过程,假设同一时候须要保存在session中的javabean,则此javabean须要实现Serializable接口,实现此接口的javabean,不须要配置到web.xml文件里。在session被活化或钝化时,保存在session中的对应javabean运行的方法。

(1)编写一个Person类实现此接口,而且实现序列化接口

package cn.zq.domain;

import java.io.Serializable;

import javax.servlet.http.HttpSessionActivationListener;
import javax.servlet.http.HttpSessionEvent; public class Person implements HttpSessionActivationListener,
Serializable{ private static final long serialVersionUID = 7606213806247294106L; private String name; public Person(String name) {
this.name = name;
} public Person() {} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String toString() {
return "Person [name=" + name + "]";
} public void sessionDidActivate(HttpSessionEvent e) {
System.out.println("------------------------");
System.out.println(this+"活了...");
System.out.println("这个session是"+e.getSession());
} public void sessionWillPassivate(HttpSessionEvent e) {
System.out.println("------------------------");
System.out.println(this+"钝化了...");
System.out.println("这个session是"+e.getSession());
} }

(2)在tomcat的文件夹下的conf\Catalina\localhost配置这个项目

<Context  docBase="D:\\code\\j2ee\\listener\\WebRoot">
<Manager className="org.apache.catalina.session.PersistentManager"
saveOnRestart="true">
<Store className="org.apache.catalina.session.FileStore"
directory="c:/a">
</Store>
</Manager>
</Context>

(3)编写測试jsp

	<%
if(session.getAttribute("p") == null){
int rand = new Random().nextInt(50);
Person p = new Person();
p.setName("p" + rand);
session.setAttribute("p", p);
} //在浏览器设置这个cookie能确保,下次訪问时。通知server当前的cookie
Cookie cookie = new Cookie("JSESSIONID", session.getId());
cookie.setMaxAge(60*10);
cookie.setPath(request.getContextPath());
response.addCookie(cookie);
%>
${p }
<hr/>
<%=session.getId() %>
<hr/>

(4)測试并查看结果,将每次的结果进行对照。

版权声明:本文博主原创文章。欢迎各转载。转载请注明出处!

servlet-显示器的更多相关文章

  1. (jsp+servlet+javabean )MVC架构

    MVC是三个单词的缩写,这三个单词分别为:模型.视图和控制. 使用的MVC的目的:在于将M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式.比如Windows系统资源管理器文件夹内容的显示方 ...

  2. servlet文件下载

    创建web工程servlet,新建DownloadServlet.java package com.xmyself.servlet; import java.io.File; import java. ...

  3. java中servlet的各种路径

    1. web.xml中<url-pattern>路径,(叫它Servlet路径!) > 要么以“*”开关,要么为“/”开头 2. 转发和包含路径 > *****以“/”开头:相 ...

  4. Servlet监听器笔记总结

    监听器Listener的概念 监听器的概念很好理解,顾名思义,就是监视目标动作或状态的变化,目标一旦状态发生变化或者有动作,则立马做出反应. Servlet中的也有实现监听器的机制,就是Listene ...

  5. JavaWeb——Servlet

    一.基本概念 Servlet是运行在Web服务器上的小程序,通过http协议和客户端进行交互. 这里的客户端一般为浏览器,发送http请求(request)给服务器(如Tomcat).服务器接收到请求 ...

  6. servlet 简介,待完善

    什么是Servlet?① Servlet就是JAVA 类② Servlet是一个继承HttpServlet类的类③ 这个在服务器端运行,用以处理客户端的请求 Servlet相关包的介绍--javax. ...

  7. java web学习总结(五) -------------------servlet开发(一)

    一.Servlet简介 Servlet是sun公司提供的一门用于开发动态web资源的技术. Sun公司在其API中提供了一个servlet接口,用户若想用发一个动态web资源(即开发一个Java程序向 ...

  8. servlet使用入门

    创建web工程servlet,然后新建TestServlet.java package com.xmyself.servlet; import java.io.IOException; import ...

  9. Web网站中利用JavaScript中ActiveXObject对象获取硬件信息(显示器数量、分辨率)从而进行单双屏跳转

    前言:最近这两天工作上,要实现一个功能,在好友阿聪的帮助下,算是比较好的解决了这个需求. B/S的Web网站,需要实现点击按钮时,根据客户端连接的显示屏(监视器)数量进行,单双屏跳转显示新页面. 由于 ...

  10. 基于jsp+servlet图书管理系统之后台万能模板

    前奏: 刚开始接触博客园写博客,就是写写平时学的基础知识,慢慢发现大神写的博客思路很清晰,知识很丰富,非常又价值,反思自己写的,顿时感觉非常low,有相当长一段时间没有分享自己的知识.于是静下心来钻研 ...

随机推荐

  1. 基于bootstrap的主流框架有哪些

    基于bootstrap的主流框架有哪些 一.总结 一句话总结:其实可以直接百度bootstrap后台模板,出来一大堆,想用哪个用哪个. 二.[前端框架系列]浅谈当前基于bootstrap框架的几种主流 ...

  2. 全双工 串口 stm32

  3. [Angular] Angular Advanced Features - ng-template , ng-container, ngTemplateOutlet

    Previously we have tab-panel template defined like this: <ul class="tab-panel-buttons" ...

  4. Android5.0(Lollipop) BLE蓝牙4.0+浅析概念(四)

    作者:Bgwan链接:https://zhuanlan.zhihu.com/p/23679793来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 置顶:此文转载CSDN博 ...

  5. md5解密猜想

    md5解密猜想 一.总结 一句话总结:可以用有技巧性(常用密码,相关信息)的暴力破解. 二.md5解密猜想 1.暴力破解 其实md5也是由那些常用的字符串组组成的32位密文,所以可以把那些常用字符串( ...

  6. Tomcat请求处理过程(Tomcat源代码解析五)

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/ ...

  7. CleanCode代码整洁之道培训总结(2015-03-14)

    为期四天的CleanCode培训时间非常短.非常难准确掌握一些知识.但让我对代码有了一个又一次的认识和启示:之前也有看过设计模式.重构之类的书,看完之后也有一些感触,过后在写代码中还是不能应用进来,事 ...

  8. Java随机验证吗

    <span style="font-size:18px;">package com.java.process.jsp; import java.awt.Color; i ...

  9. PatentTips - Highly-available OSPF routing protocol

    BACKGROUND OF THE INVENTION FIG. 1A is a simplified block diagram schematically representing a typic ...

  10. jquery插件课程2 放大镜、多文件上传和在线编辑器插件如何使用

    jquery插件课程2 放大镜.多文件上传和在线编辑器插件如何使用 一.总结 一句话总结:插件使用真的还是比较简单的,引包,初始化,配置参数(json),配置数据(json),而后两步不是必须的.而且 ...