Java Web(Servlet)

Servlet

Servlet是只运行在服务器端的java类,运行Servlet程序需要将代码部署到服务器
Servlet使用
java类继承HttpServlet类,并实现doGet()和doPost()方法,网络请求方式为GET方式时执行doGet(),否则执行doPost()

public class servlet_demo extends HttpServlet{
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        // TODO Auto-generated method stub
        super.doGet(req, resp);
    }
    
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        // TODO Auto-generated method stub
        super.doPost(req, resp);
    }
} 

每个Servlet都需要在web.xml文件中进行如下配置

<servlet>
  <servlet-name>(可以任意指定,但不能重复)</servlet-name>
  <servlet-class>(servlet完整路径,包名.类名)</servlet-class>
</servlet>

配置Servlet的访问路径

<servlet-mapping>
  <servlet-name>(servlet名称,需与上面一致)</servlet-name>
  <url-pattern>/s(用于浏览器通过url访问,如[http://localhost:8080/](http://localhost:8080/)项目名/s)</url-pattern>
<servlet-mapping>

jsp页面调用Servlet可以通过表单或者超链接

Servlet应用

①获取请求信息的头部信息
通过request.getHeaderNames()等到请求信息头部内容
request.getMethod()取出提交表单的方式,post或get
request.getProtocal()取出客户发出请求时使用的协议
request.getRemoteAddr()取出客户的IP地址

②获取参数信息
通过request.getParameter(“键名”)方法得到

③ Servlet跳转
Response.setRedirect(“目标servletname”)get方式,重定向方式,request和response对象会重新产生,数据会丢失
RequestDispatcher rd=request.getRequestDispatcher(“目标servletname”);
rd.forward(request,response);请求传递方式,请求方式由上一个请求决定

④ Cookie操作(在客户端保存信息的技术)
构造方法:public Cookie(String name(Cookie名),String value(Cookie值));
Cookie类常用方法:getName()、set/getValue()、set/getMaxAge()设置和获取Cookie在客户机的有效时间,即有效秒数……
在HttpServletResponse接口在定义了addCookie()方法来向浏览器发送Cookie对象

public class SaveCookie extends HttpServlet {
    protected void service(HttpServletRequest request,HttpServletResponse
             response)throws ServletException,IOException
             {
                response.setContentType("text/html;charset=UTF-8");
                PrintWriter out=response.getWriter();
                Cookie tempCookie=new Cookie("temp", "87654321");
                tempCookie.setMaxAge(-1);
                response.addCookie(tempCookie);
                Cookie cookie=new Cookie("cookie", "6666");
                cookie.setMaxAge(0);
                response.addCookie(cookie);
                String user=request.getParameter("user");
                if (user!=null) {
                    Cookie userCookie=new Cookie("user", user);
                    userCookie.setMaxAge(60*60*24);
                    userCookie.setPath("/");
                    response.addCookie(userCookie);
                }
                RequestDispatcher readCookie =getServletContext().getRequestDispatcher("/servlet/ReadCookie");
                readCookie.include(request, response);
             }
}

在HttpServletRequest接口中定义了getCookie方法来读取浏览器发送的web服务器所在的Cookie消息

public class ReadCookie extends HttpServlet {
    protected Cookie getCookieValue(Cookie[] cookies,String name)
    {
       if (cookies!=null) 
        for (Cookie c: cookies) 
        {
            if (c.getName().equals(name)) 
            {
                return c;
            }
        }
        return null;
    }
    public void service(HttpServletRequest request,HttpServletResponse response)
      throws ServletException,IOException
      {
        response.setContentType("text/html; charset=UTF-8");
        PrintWriter out=response.getWriter();
        Cookie tempCookie=getCookieValue(request.getCookies(), "temp");
        if (tempCookie!=null) {
            out.println("临时Cookie值:"+tempCookie.getValue()+"<br/>");
        }
        else
            out.println("临时Cookie未设置!<br/>");
        Cookie cookie=getCookieValue(request.getCookies(), "cookie");
        if(cookie!=null)
            out.println("cookie:"+cookie.getValue()+"<br/>");
        else
            out.println("cookie已经被删除!<br/>");
        Cookie userCookie=getCookieValue(request.getCookies(), "user");
        if (userCookie!=null) {
            out.println("user:"+userCookie.getValue());
        }
        else
            out.println("user未设置!");
      }
}

Session

Session对象用来保存每个用户的信息和会话状态,由服务器端自动创建,可以实现在一个页面多个会话中保留值

与Cookie的区别:session存储在服务端,相对安全且存储长度限制也比Cookie的存储长度限制扩大了

在Servlet中使用HttpSession对象来描述Session,使用HttpServletRequest接口的getSession方法来获得一个HttpSession对象

public class SessionServlet extends HttpServlet {


    public void service(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        HttpSession session=request.getSession();
        session.setMaxInactiveInterval(60*60*24);
        if (session.isNew()) {
            //向session中写入值
            session.setAttribute("session", "Servlet"); 
            out.println("新会话已经建立!");
        }
        else
            out.println("会话属性值:"+session.getAttribute("session"));
    }
}

HttpSession接口主要方法

geiId:返回当前HttpSession对象的SessionID

getCreateTime:返回创建时间

getLastAccessedTime:返回上一次被访问的时间

set/getMaxInactiveInterval:用来设置和返回当前HttpSession对象的可空闲最长时间(秒),这个时间也就是当前会话的有效间隔

isvalidate:强制当前的HttpSession对象失效,这样web服务器可以立即释放该对象

set/get/removeAttribute:将一个String类的ID和一个对象相关联,并将其保存在当前的HttpSession对象中/返回(删除)一个和String类型相关联的对象


Servlet过滤器

与过滤器相关的Servlet共包含3个简单的接口(Filter、FilterChain、FilterConfig)
实现过滤器功能,必须先实现Filter接口,包含3个方法,分别为
init()方法:实例化
doFilter():用于处理请求和响应
destroy():销毁时调用

过滤器需要在web.xml中配置

<filter>
  <filter-name>FilterName</filter-name>
  <filter-class>包名.类名</filter-class>
<init-param>用来进行参数初始化工作
  <param-name>ParamNamel</param-name>
  <param-value>ParamValue</param-value>
</init-param>
</filter>

<filter-mapping>过滤器映射到JSP文件
   <filter-name>FilterName</filter-name>
   <url-pattern>/path/FileName.JSP</url-pattern>
<filter-mapping>

jsp页面

<%@ page language="java" import="java.util.*" contentType="text/html;charset=gb2312"%>

<html>
  <head>
    <title>欢迎来到servlet过滤器</title>
  </head>
  
  <body>
    <%  for(int i=0;i<5;i++)
        out.println("Hello,Filter!"+ "<br>");       
     %>
  </body>
</html>

过滤器

public class CopyrightFilter implements Filter {

    protected FilterConfig config;
    protected String date;
    
    public void destroy() {
        this.config=null;
    }

    /**
     * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
     */
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        
        chain.doFilter(request, response);
        PrintWriter out=response.getWriter();
        out.println("<br><center><font size=4> 版权所有:惠州学院</font></center>");
        if (date!=null) {
            out.println("<br><center><font size=4>"+date+"</font></center>");
        }
        out.flush();
    }

    /**
     * @see Filter#init(FilterConfig)
     */
    public void init(FilterConfig fConfig) throws ServletException {
        this.config=fConfig;
        date=fConfig.getInitParameter("date");
    }
}

web.xml文件

  <filter>
    <filter-name>CopyrightFilter</filter-name>
    <filter-class>servlets.CopyrightFilter</filter-class>
    <init-param>
        <param-name>date</param-name>
        <param-value>2012.9</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>CopyrightFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping> 

运行结果


servlet过滤器.png

Servlet监视器

①监听ServletContext信息
需要实现ServletContextListener和ServletContextAttributeListener接口
web.xml文件配置:
<listener>
<listener-class>包名.类名</listener-class>
</listener>

  <!--jsp  -->
    <%
        out.println("Test ServletContextListener"+"<br>");
        application.setAttribute("userid", "1234"); //添加一个属性
        application.setAttribute("userid", "12345");//替换已经添加的属性
        application.removeAttribute("userid");//删除该属性
        out.println("监听器已做出反应,详情请见控制台日志");
     %>
//ServletListener
public class MyServletContextListener implements
        ServletContextListener,ServletContextAttributeListener{
    private ServletContext context=null;

    @Override
    public void attributeAdded(ServletContextAttributeEvent sa) {
        System.out.println("增加ServletContext对象的一个属性:attributeAdded('"+sa.getName()+"',' "+sa.getValue()+"')");
    }

    @Override
    public void attributeRemoved(ServletContextAttributeEvent sa) {
        System.out.println("删除ServletContext对象中的某一个属性:attributeRemoved('"+sa.getName()+"')");
        
    }

    @Override
    public void attributeReplaced(ServletContextAttributeEvent sa) {
        System.out.println("替换ServletContext对象的某一个属性值:attributeReplaced('"+sa.getName()+"','"+sa.getValue()+")");
        
    }

    @Override
    public void contextDestroyed(ServletContextEvent s) {
        this.context=null;
        System.out.println("ServletContext被释放。。。"); 
    }

    @Override
    public void contextInitialized(ServletContextEvent s) {
        this.context=s.getServletContext();
        System.out.println("ServletContext初始化。。。"); 
    }
}

web.xml

  <listener>
    <listener-class>servlets.MyServletContextListener</listener-class>
  </listener>

②监听HTTP会话信息(Session对象的创建、销毁、会话中属性的设置请求、会话的状态和会话的绑定信息等)
用到HttpSessionAttributeListener、HttpSessionListener、HttpSessionActivationListener这三个接口,这些接口的主要方法为:

sessionCreated(HttpSessionEvent agr0):Http会话被创建时调用
sessionDestoryed(HttpSessionEvent arg0):…..释放时
sessionDidActivate(HttpSessionEvent arg0):对Http会话处于active情况下进行监听
sessionWillPassivate(….):处于passivate监听
attributeAdded(….):对Http会话中的属性添加进行监听
attributeReplaced(…):对Http会话中的属性修改进行监听
attributeRemove(…):……删除进行监听

public class MySessionListener implements 
        HttpSessionAttributeListener,HttpSessionListener{
    ServletContext context=null;
    int users=0;

    @Override
    public void sessionCreated(HttpSessionEvent arg0) {
        // TODO Auto-generated method stub
        users++;
        System.out.println("sessionCreated('"+arg0.getSession().getId()+"'),"+"目前拥有"+users+"个用户");
        context.setAttribute("users", new Integer(users));
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent arg0) {
        // TODO Auto-generated method stub
        if(users==0)
        {
            users=0;
        }
        else {
            users--;
        }
        System.out.println("sessionCreated('"+arg0.getSession().getId()+"'),"+"目前拥有"+users+"个用户");
        context.setAttribute("users", new Integer(users));      
    }

    @Override
    public void attributeAdded(HttpSessionBindingEvent arg0) {
        // TODO Auto-generated method stub
        System.out.println("attributeAdded('"+arg0.getSession().getId()+"','"+arg0.getName()+"','"+arg0.getValue()+"')");
    }

    @Override
    public void attributeRemoved(HttpSessionBindingEvent arg0) {
        // TODO Auto-generated method stub
        System.out.println("attributeRemoved('"+arg0.getSession().getId()+"','"+arg0.getName()+"','"+arg0.getValue()+"')");
    }

    @Override
    public void attributeReplaced(HttpSessionBindingEvent arg0) {
        // TODO Auto-generated method stub
        System.out.println("attributeReplaced('"+arg0.getSession().getId()+"','"+arg0.getName()+"','"+arg0.getValue()+"')");
    }
}

web.xml配置

  <listener>
    <listener-class>servlets.MySessionListener</listener-class>
  </listener>

③对客户端请求(ServletRequest)进行监听(请求对象的创建、销毁以及其属性的添加、更改和删除)
实现ServletRequestListener和ServletRequestAttributeListener接口,主要方法为:
ServletRequestListener():监听客户端请求的创建和销毁
attributeAdded(HttpSessionBinderEvent arg0):对属性添加进行监听
attributeReplaced(…):….修改
attributeRemoved(….):….删除

public class MyRequestListener implements ServletRequestListener,ServletRequestAttributeListener{

    @Override
    public void attributeAdded(ServletRequestAttributeEvent arg0) {
        // TODO Auto-generated method stub
        System.out.println("attributeAdded('"+arg0.getName()+"','"+arg0.getValue()+"')");
    }

    @Override
    public void attributeRemoved(ServletRequestAttributeEvent arg0) {
        // TODO Auto-generated method stub
        System.out.println("attributeRemoved('"+arg0.getName()+"','"+arg0.getValue()+"')");     
    }

    @Override
    public void attributeReplaced(ServletRequestAttributeEvent arg0) {
        // TODO Auto-generated method stub
        System.out.println("attributeReplaced('"+arg0.getName()+"','"+arg0.getValue()+"')");        
    }

    @Override
    public void requestDestroyed(ServletRequestEvent sre) {
        // TODO Auto-generated method stub
        System.out.println("request destoryed");
    }

    @Override
    public void requestInitialized(ServletRequestEvent arg0) {
        // TODO Auto-generated method stub
        System.out.println("Request init");
        ServletRequest sr=arg0.getServletRequest();
        System.out.println(sr.getRemoteAddr());
    }
}

web.xml文件配置

  <listener>
    <listener-class>servlets.MyRequestListener</listener-class>
  </listener>
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,509评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,806评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,875评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,441评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,488评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,365评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,190评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,062评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,500评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,706评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,834评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,559评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,167评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,779评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,912评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,958评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,779评论 2 354

推荐阅读更多精彩内容