zoukankan      html  css  js  c++  java
  • Servlet

    服务器


     

    1.管理互联网资源(HTML 图片  视频  数据)

    2.被动等待用户的请求request(方法)

    3.将用户请求的内容,返回(响应  response)给客户端(用户)

    URL(统一资源定位符)

    url:http://ip:port/项目名/资源路径

    rui:/项目名/资源路径   本tomcat内部资源路径

      应用:form   a  link  img

    url-pattern:/资源路径    本项目内部资源

    servlet


     

    概念一段Java程序,可以运行在tomcat端

    语法Servlet标准(接口)JavaEE标准(servlet-api.jar)

    1.接口
        interface Servlet{
            inint(){servlet对象创建的自动调用}
            destroy(){servlet对象销毁的自动调用}
            // 用户访问tomcat服务器的该程序,调用service方法
            service(){
                //用户请求后,执行的代码
            }
    
    2.JavaEE提供类:  HttpServlet   实现了Servlet接口
    
    3.自定义tomcat运行代码
        public class MyServlet extends HttpServlet{
            public void service(){
                //覆盖servlet的service方法
            }
        }

    核心:

     WEB-INFclasses  :编译后的servlet的class文件(带包)

    web.xml

    • 管理servlet程序,注册servlet程序servlet的名字  ----servlet类全类名
    • 映射servlet被访问的路径---servlet名字  访问路径  
    • <servlet>
            <servlet-name>firstServlet</servlet-name>
            <servlet-class>com.lhl.demo1.FirstServlet</servlet-class>
        </servlet>
        
        <servlet-mapping>
            <servlet-name>firstServlet</servlet-name>
            <url-pattern>/firstDate</url-pattern>

     异常

    1.405 

    Method Not Allowed

    原因:方法调用错误

    解决:1.方法名是否错误  2.service方法内,不能调用父类方法

    2.访问servlet变成下载

    原因:响应类型设置有问题

    resp.setContentType("text/html;charset=UTF-8");

    3.servlet修改后,没有变化

    原因:servlet代码修改,tomcat需要重启

    4.500错误

    1.classNotFundException:web.xml的servlet的全类名写错

    2.服务端java代码运行异常

    5.404错误

    原因:浏览器访问地址   不存在    地址写错(浏览器地址栏,url-pattern不一致)   tomcat启动失败

     servlet生命周期


     

    概念:servlet创建时机和活跃使用时机、销毁时机

    interface Servlet{
        //对象创建执行
        init(){}
        
        //浏览器请求到servlet,提供服务的运行方法
        service(){}
    
        //对象销毁执行
        destroy(){}
    • 1.servlet创建

        第一个浏览器访问servlet,对象会被创建

        一个Servlet类只会创建一个servlet对象,且提供所有用户访问

      • 第一次访问创建
      • tomcat启动创建     <load-on-startup>1</load-on-startup>
    • 2.servlet服务

        浏览器每次访问都会调用service方法

    • 3.servlet销毁

        tomcat关闭,销毁servlet对象

    • 4.重点:

        Servlet对象只有一个单实例,面向多线程访问,线程不安全,要求不要添加数据属性

    Servlet执行原理

    tomcat
    
    1.获得url的项目名,从本tomcat下的webapps下找到对应文件
    2.根据url中servlet的url-pattern,从web.xml找到servlet-name,找到servlet-class被访问的servlet全类名
    3.Class<> cl = Class.forName(“Servlet全类名”)//获得servlet的类对象
    4.Servlet servlet = (Servlet)cl.newInstance();//创建出了类的对象
    5.tomcat先调用servlet.init()方法
    6.servelt.service(res,resp)调用servlet的service方法
    7.服务器将响应结果返回给浏览器
    8.浏览器发出第二次请求
    9.tomcat会直接根据url-pattern,找到servlet对象,调用servlet.service方法

     

    Servlet请求参数


     

    概念:浏览器请求servlet携带的数据叫做请求参数

    Servlet接收请求参数

    •   request.getParameter(“表单元素的name”);//接收单个数据参数 返回String
    •   request.getParameterValues("表单元素的name")//获得一个名字对应多个值(返回值String数组)

    浏览器请求Servlet的方式

    • 1.浏览器地址栏
    • 2.form表单的action
    • 3.超链接的href

       

     请求参数乱码问题

      Post提交乱码

      解决:req.setCharacterEncoding("UTF-8");

    注意:设置编码,在接收请求参数之前设置。

       Get提交乱码

    • 1.form表单的get方式
    • 2.超链接携带的数据
    • 3.浏览器发送请求参数

    修改tomcat的conf/server.xml中<connector/>  加上URIEncoding="UTF-8"

     多个Servlet配合工作

    请求转发

      作用:多个servlet配合完成一个功能

      核心:

      • 服务器(当前web项目)内部发送流程的跳转
      • forward请求转发连接多个servlet,处于一个请求过程当中 
      • 页面显示信息和浏览器地址栏不一致
    RequestDispatcher rdp = request.getRequestDispatcher("转发后下一个servlet的url-pattern");  //获得转发器
    
    rdp.forward(req,resp);  //foward转发,调用转发动作

     Request作用域


     

     概念:JavaEE提供的存储数据(命名属性)的空间

    命名属性:名字--值

    生命周期:一次请求过程(请求转发的servlet正好处于一次请求过程)

    存:
        request.setAttribute("名字",值/数据/对象/xxx);
    
    取:
        request.getAttribute("名字");

     请求重定向(Redirect)


     

    核心

      1.服务器外部跳转

      2.通知浏览器,自动请求下一个要跳转的页面或者Servlet(不需要用户操作)

      3.重定向连接的servlet或者资源,处于两个不同的请求过程

      4.请求重定向后的页面和浏览器的地址一致

    resp.sendRedirect("/项目名/资源路径url-pattern");

     

    会话技术


     

    http协议:无状协议,协议本身不会记录任何信息,两次信息传输之间没有任何关系

    应用:浏览器记录,登录验证,验证码,购物车(阉割版)

    解释:浏览器和服务器之间,多次交互依然保存数据(状态)的一种机制

     

    Cookie(客户端会话技术)

    概念:服务器保存在浏览器上的一小段字符串(key=value)

    工作机制

    • 1.服务器tomcat创建
    • 2.保存在浏览器
    • 3.浏览器每次访问服务器,都会将服务器(web项目)保存在本浏览器上的cookie发送到服务器上

    编码:

    1.创建
    Cookie cookie = new cookie("key","value");
    
    2.将cookie存入浏览器
    response.addCookie(cookie);//将cookie随着响应返回给浏览器
    
    3.设置生命周期
    cookie.setMaxAge(秒);
    
    4.获得浏览器请求携带的cookie信息
    Cookie[] cs = response.getCookies();
    cs[0].getName();//cookie的key
    cs[0].getValue();//cookie的value

    Cookie的特点

    1.存在浏览器上   

      优点:分担服务器压力,不会占用服务器资源

      缺点:数据不太安全

    2.cookie只能保存字符串,不能保存中文

    3.cookie生命周期

      设置0等于删除cookie

      设置-1等于浏览器关闭,cookie丢失

      模式为浏览器关闭,cookie丢失

    4.cookie和浏览器一一对应

    HttpSession(服务器会话技术)

    工作机制服务器为每个浏览器分配一个一一对应的存储空间

    特点:

      1.存放在服务器

      2.每个浏览器和session一一对应

      3.HttpSession生命周期夸多次请求依然存在

    API

    1.属性  id

    2.获得session 

    request.getSession();
    第一次访问会创建seesion对象
    第2到 n次访问会获得原有的session对象给你

     作用

    作用域,存储命名属性

    存:session.setAttribute("name",值);
    
    取:seesion.getAttribute("name");
    
    移除:session.removeAttribute("name");

    应用(强制登录/登录验证)

    某些资源(HTML、Servlet)的访问需要用户登录后才能访问,否则强制去登录页面

    思路 :web项目服务器记住用户

    Session失效

    • 1.浏览器关闭,session失效
    • 2.session默认保留30分钟。(浏览器和服务器之间,超过30分钟没有请求)
    • 3.session.invalidate() 或者 session.removeAttribute("名字")  主动失效

    Cookie和Session对比

    相同点

    • 和浏览器一一对应
    • 生命周期跨多次请求依然存在

    不同点

     cookie

    • 1.存在浏览器
    • 2.只能存字符串(缺点)
    • 3.数据能通过浏览器查看,不太安全(缺点)

    session

    • 1.存在服务器
    • 2.可以存对象,可以存入任何类型(优点)
    • 3.数据保存在服务器,相对安全(优点)
    • 4.session中数据过多,会占用服务器资源,给服务器压力(缺点)

    Seesion原理

    机制:

    浏览器第一次请求服务器web项目,会为该浏览器创建一个session对象,并获得session的id,id以cookie的形式写回到浏览器。以后每次浏览器请求服务器会自动携带cookie(JesessionId)信息,tomact通过获得cookie中名字为jesessionid的cookie的value值和内部所有的session对象匹配,找到对应的session对该浏览器使用

    内部代码实现(局部)
    1.浏览器第一次请求服务器
    HttpSession session = new XxxxSession();
    String id = session.getId();
    //将session保存在服务器内存中(集合)
    Map<String,HttpSession> map = new ConcurrentHasMap<String,HttpSession>();
    Cookie ck = new Cookie("jsessionid",id);
    resp.addCookie(ck);
    
    2.浏览器第二次(以后)请求服务器
    Cookie[] cks = req.getCookies();
    for(Cookie c:cks){
        if(c.getName().equals("jsessionid")){
            String sessionId = c.getValue();
            //根据sessionid找到对应的session对象
            HttpSession session = map.get(sessionId);
        }
    }

     用户禁用Cookie

     对所有超链接+表单等一切请求服务器的url路径,全部进行url重写

    String  重写后的url = resp.encodeUrl(原url地址)

     Filter过滤器


     

     概念:Servlet中提供的技术,可以过滤浏览器发出的请求,并且决定放行请求还是中断请求

    编码

    1.自定义一个java类,实现Filter接口
    public class EncodingFilter implements Filter{
    
    //请求经过filter要执行的代码
        doFilter(FilterChain chain){
    
        //放行之前
    
        chain,doFilter(req,resp);//放行代码
    
        //响应回来的代码
        }
    }
    
    
    2.在web.xml中注册信息
    <filter>
        <filter-name></filter-name>
        <filter-class></filter-class>
    </filter>
    <filter-mapping>
        <filter-name></filter-name>
         <url-pattern>过滤请求的servlet或者html的url-pattern</url-pattern>
    </filter-mapping>

     Filter的url-pattern写法:

    • 1.写多个
    • 2./*---过滤所有请求
    • 3.*.do---过滤请求以.do的请求
    • 4./xxxx/*---过滤路径中url-pattern中,以/xxxx/开头的请求

     ServletContext


     

    作用域:一个web应用只有一个ServletContext对象

    1.获得ServletContext
    ServletContext ctx = session.getServletContext();
    
    2.存
    ctx.setAttribute("name",值);
    
    3.取
    ctx.getAttribut("name");
    
    4.移除
    ctx.removeAttribute("name");

     常用API

    1.全局参数

      web.xml启动加载完毕会将信息存入servletContext

    1.在web.xml书写常亮配置
    <context-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </context-param>
    
    2.从servletContext中获得常亮配置
    HttpServletRequest reqs = (HttpServletRequest) req;
    ServletContext ctx = reqs.getSession().getServletContext();
    String value
    = ctx.getInitParameter("encoding");
    req.setCharacterEncoding(value);
    resp.setCharacterEncoding(value);

    2.web应用内流的相对路径

    String 真实路径 = ctx.getRealPath("/项目名下的相对路径");

     

    3.动态获取项目名

    String ctxtPath = request.getContextPath();

    监听器


     

     ServletContextListener:监听ServletContext对象的创建和销毁

    HttpSessionListener:监听HttpSession对象创建和销毁

    ServletRequestListener:监听ServletRequest对象创建和销毁

     

  • 相关阅读:
    tomcat 启动超时
    读书笔记-String
    读书笔记-集合
    读书笔记-算法
    多变量梯度下降
    多变量线性回归
    梯度下降算法在线性回归中的运用
    梯度下降
    线性回归——代价函数
    线性回归
  • 原文地址:https://www.cnblogs.com/lhl0131/p/13060015.html
Copyright © 2011-2022 走看看