Java进阶(二)Servlet

来源:互联网 发布:网络大屏广告机 编辑:程序博客网 时间:2024/05/21 17:31

写Java工程,最常见的两种架构 C/S 和 B/S, 我认为两者最大的区别就要说层次问题。C/S 为 两层架构,而 B/S 则是 三层。现在的公司企业越来越倾向于三层架构,也就是C/S,其中每一层都非常重要,但是最重要的我感觉还是控制器。控制整体工程的走向。既然提到了控制器,就不能不说 Servlet。

Servlet

本质 :是一小段java程序
作用:处理浏览器发出的请求并返回结果
特点:不会自己运行必须有web容器来?

响应请求的方式

(第一次请求) --> 构造器 --> 初始化 --> service (多次请求在此循环) --> (关闭服务) 销毁

调整乱码问题

需要修改 Java程序

request.setCharacterEncoding("UTF-8");response.setCharacterEncoding("utf-8");

修改 HTML文件

<meta http-equiv="content-type" content="text/html; charset=UTF-8">

修改 tomcat 配置文件 conf/server.xml

 <Connector port="8888" protocol="HTTP/1.1"               connectionTimeout="20000"               redirectPort="8443" URIEncoding="UTF-8"/>

Servlet 中的 service() doGet() doPost() 方法

所有超链接 表单 默认get 方式
表单最好重写方式为 post (用 method 属性)

Service是 GenericServlet 中最重要的方法,每次客户向服务器发出请求时,服务器都会调用这个方法。
        

protected void service(HttpServletRequest req, HttpServletResponse resp)                          throws ServletException, java.io.IOExceptionpublic void service(ServletRequest req, ServletResponse res)             throws ServletException, java.io.IOException

第一个参数保存了客户向服务器发送的请求,第二个参数用来设置如何对客户进行响应。
若未重写service方法,则不管是 post 还是 get 方法提交过来的连接,都会在service中处理,然后,由service来交由相应的 doPost 或 doGet 方法处理。
如果你重写了 service 方法,就不会再调用 doPost 或 doGet 了。

超链接、URL地址栏直接访问、form表单默认,都是get方法请求

在链接最后加问号 ? 再加参数(参数以键值对的形式出现),参数之间用 & 分隔
    <a href="login.do?myLogin=jerry&myPass=asd123">login</a>

在 form 表单中,可以使用 method 属性来指定访问方式,推荐使用 post
优点:
1、数据传递:
        get方法默认,在action后面加?添加参数(键值对)
        post方法请求,对整个form表单操作,把所有数据封装到form表单中传递,也是键值对,但URL中看不到
2、安全性问题:
        get不安全,但是效率高,传递简单的,安全性低的(超链接使用);
        post安全性较高;
3、数据量
        get数据量较小,只能传递字符形式;
        post数据量较大,可传递图片,压缩包等等;
4、字符集
        get支持的字符集少;
        post支持的字符集多。

Servlet 四个作用域

1、ServletContext 全局的(代表整个 web 工程)
    相当于一个Map集合,先放再取,整个web工程下有效
    key唯一,会被覆盖,作用于太大,反而不太方便
    
    //继承HttpServlet或直接实现GenericServlet接口的类的对象,才能调用getServletContext()
        ServletContext context = this.getServletContext();    
    
        setAttribute(java.lang.String name, java.lang.Object object):添加,修改
        removeAttribute(java.lang.String name) :删除
        getAttribute(java.lang.String name) :查询
        getAttributeNames() :枚举遍历Key信息

2、HttpServletRequest 不仅是一个参数,还是一个作用域(由Web容器创建)
    封装请求信息(与response应答对应),也可用于作用域,用的最多
        getHeader、getHeaderNames、getMethod、getRequestURL() 、getRequestURI()
        getContextPath()获取当前工程名;
        getRemoteAddr()远程地址
        
    Request作用域(本来只能作用于方法体中)
        
3、HttpSession 会话机制
    便于区分各个应答接受状态

    SessionID 唯一标识一个 Session
        1)cookie
        2)URL拼接

    HttpServletRequest 请求
        调用 getSession 就可以获取到相应的session对象
    
    Session作用域
        范围:区分每一个浏览器(每一个浏览器窗口就是一个作用域)
        超时以后自动销毁(最后一个请求之后1800秒之后)

4、ServletConfig 最小的
    类中属性,作用于一个类中的所有方法   

请求转发器

Interface RequestDispatcher(类似于插座接口转换器)

请求链不断,就可以一直使用该作用域


public void forward(ServletRequest request,ServletResponse response)             throws ServletException,java.io.IOException
方法调用,参数传递,扩大作用域
        
public void include(ServletRequest request,ServletResponse response)             throws ServletException,java.io.IOException 
转发的时候,请求的类型一直不变


页面跳转倒计时:

//第一种方式:直接使用request对象的转发RequestDispatcher rd = request.getRequestDispatcher("/login.do");rd.forward(request, response);            //第二种方式:使用response设置跳转(3秒后跳转到登录页面)response.setHeader("refresh","3;url=http://127.0.0.1:8888/servlet6_test/login.html");

实现转发的两种方式:
1、  HttpServletRequest --> RequestDispatcher(请求转发器)       
        forward方法(请求链不断)进行转发:
        1、请求链不断,共享同一个request对象
        2、服务器内部转发(不能断),只能在同一个web工程中进行转发;
        3、地址栏不变

2、  HttpServletResponse 类 
        sendRedirect方法(请求链断开)进行重定向:
        1、请求链断开,不共享同一个request对象
        2、可以在不同的web工程中进行跳转(可以实现单点登录功能)
        3、地址栏改变


0 0
原创粉丝点击