Servlet && Jsp(个人笔记)

Servlet简介:
        是一种web服务器端编程技术,是实现特殊的接口,由支持Servlet负责对应的web服务器调用
    和启动运行,一个servlet负责对应的一个或一组url的访问请求,并返回相应的内容。
    IDEA对tomcat的webapps目录做了优化,路径名有一个虚拟项目名称

*   url:http://localhost:8080/firstweb/first
    解析:服务器地址:端口/虚拟项目名/servlet的别名
    uri:虚拟项目名/servlet别名

    过程:浏览器发送请求到服务器,服务器根据请求url地址中的uri信息在webapps目录下找到对应的
    项目文件名,然后在web.xml中检索对应的servlet,找到后调用并执行servlet
*
*   Servlet生命周期:
        在收到请求时根据uri找到对应的项目,再根据web.xml的映射关系servlet利用反射创建对象
        然后调用init(),响应请求,关闭tomcat时对象销毁
*
*
*   MVC:model view controller
    发展历程:
        1.单一应用架构
        2.垂直应用架构
        3.分布式服务架构
        4.流式...架构
        5.云计算架构
*
*       Controller层和Service层的区别是:Controller层负责具体的业务模块流程的控制;Service层
    负责业务模块的逻辑应用设计;

    总结:在具体的项目中,其流程为:Controller层调用Service层的方法,Service层调用Dao层中的方法,
    其中调用的参数是使用Entity层进行传递的。总的来说这样每层做什么的分类只是为了使业务逻辑更加清
    晰,写代码更加方便,所以有时候也需要根据具体情况来,但是大体的都是这样处理的,因为它其实就是
    提供一种规则,让你把相同类型的代码放在一起,这样就形成了层次,从而达到分层解耦、复用、便于测
    试和维护的目的。

*   连接数据库Access denying可能因为服务被其他使用
*
    Servlet的流程处理:
        1.设置请求编码格式
        2.设置响应编码格式
        3.接收请求段的参数
        4.进行逻辑代码处理
        5.返回响应结果
*
*    处理乱码问题
      1.get请求
           1.获取字符后使用new String(name.getBytes("iso-8859-1"),"utf-8");
           2.设置request的编码格式1.request.setCharacterEncoding("utf-8");
           同时在配置文件中添加useBodyEncodingForURI=true的属性
           3.在server.xml中添加URIEncoding="utf-8"
      2.post请求
           1.request.setCharacterEncoding("utf-8");
      3.response响应
           1.response.setCharacterEncoding("gbk");依据客户端
*
*     请求分发和重定向的区别:
        Servlet重定向,浏览器发送两次请求,浏览器地址发生变化,请求过程中需要两队请求响应对象
      两个servlet不能共享请求
        请求转发请求1次,地址栏不变数据共享,跳转限制在本站资源,发生在服务端
        重定向发请求2次,地址栏变化数据不共享,跳转任意url资源,发生在客户端
*
*   对于重定向后数据就不再共享了,那么数据的共享如何实现呢?引入cookie和session,因为HTTP协议
    是一个无状态的协议,当服务端响应之后连接就会关闭,在服务器端就不再保留连接信息。
        那么客户端多次请求且需要相同参数时,应该怎么处理?
        cookie:保存在客户端,临时cookie保存在内存中,浏览器关闭cookie消失。持久化cookie保存在
        浏览器的某个目录
*       session:表示会话,在一段时间里,用户与服务器之间的交互操作,session对象是用户在发送
    不同请求参数,在服务器端保存不同请求共享数据的存储对象
        session特点:依赖cookie技术的服务端数据存储计数,由服务端创建,每个用户都有独立的session
    对象,默认存储时间30min,每次关闭浏览器都会重新请求开启一个新的sessionId,因为返回的JsessionId
    保存在浏览器的内存中,是临时的cookie所以关闭自动消失
    session可保证用户多个请求的数据共享
        cookie解决请求时含有相同值
    那么不同用户的数据共享?
        使用ServletContext:解释:运行在JVM上的每一个web应用程序都有一个与之对应的Servlet上下文
    即servlet运行环境,ServletContext对象被web应用程序中的所有servlet访问。ServletContext对象
    是web服务器中一个一直路径的根
        ServletContext:解决不同用户数据共享问题
            特点:
                1.由服务器创建
                2.所有用户共享一个ServletContext对象
                3.所有servlet可以访问同一个ServletContext中的属性
                4.每一个web项目对应一个ServletContext

        web.xml中可配置ServletContext共有属性使用context-param标签
*
*       ServletConfig对象是Servlet的专属对象,每个Servlet都有一个,是用来获取web.xml
    中的Servlet独有的配置信息
*
*   直接请求1.jsp页面是tomcat收到请求,jsp引擎根据1.jsp生成的java类执行对应的class文件
    将执行的结果输送给tomcat,tomcat发送给客户端


*                                   【JSP】
*   page标签
        import导包
        pageEncoding设置页面编码格式,但是已经设置了contentType就不需要设置pageEncoding了
      但必须保持一致
        errorPage页面发生逻辑错误要跳转的页面
        extends设置转译后的servlet继承的父类,格式-包名+类名

        局部代码块定义的代码在service方法中
        全局代码块用来定义公用的方法,方法的调用要使用局部代码块
        堆属性和方法调用使用<%=%>这种格式,注意:不能在方法或者变量后添加;
    include标签
        静态导入<%@ include file = "相对路径"%>不会讲静态导入的文件生成新的字节码文件,
    不利于维护(如重复变量名)
        动态导入<jsp:include page="相对路径路径"></jsp:include>生成新的字节码文件
    解耦,显示时合并显示
        请求转发<jsp:forward page="forward.jsp"></jsp:forward>
        jsp九大内置对象:
            request封装当前的请求数据,由tomcat创建,一次请求对以一个request对象
            response响应对象,可用于重定向
            session封装一个用户的不同请求的共享数据,一次会话对应一个session
            application等同ServletContext一个web项目只有一个,存储所有用户共享数据
            page代表jsp对象,跟java中的this指针类似
            pageContext页面上下文(每个页面对应一个),封装其他的内置对象以及当前页面的
        运行信息,伴随页面结束而结束
            config相当于ServletConfig对象,获取web.xml中的数据完成servlet初始化工作
            exception使用时必须在page指令添加属性isErrorPage=true
            out响应对象jsp内部使用的带有缓冲区的响应对象

        jsp四大作用域:
            pageContext解决当前页面的数据共享
            request一次请求的servlet数据共享,通过请求转发将数据流转到下一个servlet
            session一次会话,用户发送不同请求之间数据共享,数据可流转到其他请求
            application表示在项目内不同用户的数据共享,用户之间的数据流转
        路径问题
*           相对路径
            绝对路径>使用jsp的全局路径声明
                <%
                    String basePath = request.getScheme() + "://"
                            + request.getServerName() + ":"
                            + request.getServerPort()
                            + request.getContextPath() + "/";
                %>
                <base href="<%=basePath%>">

*   -----------------------------EL------------------------------------------
*       为了解决servlet和jsp作用域数据的交换引入EL表达式,在jsp中获取对象或者集合中
    元素的属性特别麻烦,所以使用EL表达式(获取作用域中的属性),使用的时候使用作用域中的key
    用.引用属性,[]指定索引

    示例如下
*       姓名:${param.name} 这是request里的参数获取方式
        密码:${param.pwd}
        姓名:${name}
        住址:${home}
        姓名:${azir.name}
        住址:${azir.address}
        姓名:${list[1].name}
        住址:${list[1].address}
        姓名:${hero.zed}
        住址:${hero.asso}
*
*   pageContext-->request-->session-->application
    如果四个作用域中都有同样键的时候取值按照从小到大顺序
    那么非要指定一个取值的域呢?
*       pageContext:${pageScope.name}<br>
        request:${requestScope.name}<br>
        session:${sessionScope.name}<br>
        application:${applicationScope.name}<hr>
*
*   EL表达式运算:算术运算符、关系运算符、逻辑运算
        +-*/%运算
        boolean运算
        注意:对于+运算不会做字符串拼接,只会对数字类型+操作,与字符串+运算会报错
*
*   EL表达式获取cookie和请求头信息:
        ${cookie.JSESSIONID.name}<br>
        ${cookie.JSESSIONID.value}<br>
    【EL表达式获取共享作用域的数据】对于EL表达式进行逻辑判断?当然可以使用jsp标签
    书写,但是导致书写不便,难于维护,引入JSTL,是apache对EL的扩展

*   我想说几句:jstl的导包让我火冒三丈,一直出现不能解析路径
    http://java.sun.com/jsp/jstl/core报500错误,有人说是tomcat的servlet和jsp
    版本与jstl不吻合导致,然后我换tomcat版本试不同版本的jstl和依赖包standard包还是不行
    最后我换回tomcat8之后使用jstl1.2和taglibs-standard-jstlel-1.2.5.jar才好,折腾
    了5个小时,真让人头大,尝试了很多次,最后想放弃了报着试最后一次的想法,结果他妈的
    居然好了,你说气人不!还有IDEA不需要在Schemas and DTDs中配置uri路径。
*
*   URL统一资源定位符由协议ip+port+路径组成,它是URI的子集,可以理解为用某个协议,访问某个
    服务器上的资源。只要能唯一标识一个资源就可以认为是URI
*
*   过滤器:能够对web请求和web响应的头属性和内容体进行操作的一种特殊web组件,过滤器的特殊之处
    在于本身并不直接生成web响应而是拦截web请求和响应,一边查看、提交或以某种方式操作客户机和
    服务器之间的数据交换
*

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值