天天看点

Servlet&Http&Request

1.今日内容

        今天的这个内容稍微有点多,而且事情有点多,所以一下花了两天左右,大概就说一下本篇博客的内容:1.Servlet的体系结构,主要就是可以使用继承Servlet的实现类HttpServlet;2.Http的请求体格式;3.Request的相关知识,特别多。

2.具体内容

2.1Servlet的体系结构

        由于每次如果实现Servlet接口的话,都需要重写5个方法,但是我主要只是关心service方法。因此很费事。因此产生了Servlet的实现类GenericServlet。在这个实现类的使用中,由于每次还都需要判断<form>里面的action是get还是post,也有点麻烦,因此我们现在使用的HttpServlet就出现了。我们只需要重写它里面的方法就好了。包括doGet和doPost。

        在此处,补充一个关于配置注解WebServlet的方式,一共有三种方式:

                [email protected]({"/demo1","/demo2"}),这种就是一个资源有很多路径访问;

                [email protected](“/demo/demo1”),多层目录

                [email protected](“*.do”):这种就是只要后缀名是.do就能访问到,但是一定不能加/;

2.2Http初步解析

        http:hyper text transform protocol,中文名称是超文本传输协议。身为传输协议,他就是用来定义客户端请求数据的格式和服务器发送数据的格式。

        特点:

                1.默认端口号是80;

                2.基于请求/响应模型:一次请求对应一次响应;

                3.无状态的:多次请求的数据不能通信

        版本信息:

                1.0:每次请求都要申请链接然后释放连接,速度比较慢

                1.1:每次传输在一定时间内是可以复用的;

        组成部分:

                1.请求行

                        GET /login.html HTTP/1.1

                传输方式一共七种,主要就是使用POST和GET,再说一下POST和GET的区别:

                        1.POST:请求url是没有长度限制的;请求参数包含在请求体里;

                        2.GET:请求的url长度是有限制的;请求参数包含在请求行中;

                2.请求头:里面包含客户端告诉服务器的信息;    

                        请求头名称:请求值

                       User-Agent:告诉服务器我是什么浏览器

                       Referer:告诉服务器我从哪里来

                3.请求空行:就是一行空行,主要用于分隔请求头域请求体

                4.请求体

                这个属于是POST的请求方式特有的东西,里面的东西就是POST的请求参数

2.3request相关内容

        request是客户端向服务器请求数据。首先我们先来想一下request和response的原理。当我们在Web中部署一个项目,然后启动Tomcat后,Tomcat会通过反射机制创建一个Servlet对象,然后这个对象会创建一个request和response对象,将这两个参数传入doGet或者doPost中。request是负责获取请求消息的,response是负责将响应数据封装的。在本篇中,只看request对象。

        request中包含几个作用:

        1.获取请求参数:  GET /day14/servlet?username=zhangsan HTTP/1.1

        这里面我们只重点看获取部分消息。

                获取/day14:String getContextPath()

                获取URL与URI:

                        String getRequestURL():http://localhost/day14/servlet

                        String getRequestURI():/day14/servlet

        2.获取其他信息

                在这里面定义的方法是可以用于GET和POST的;

                1.获取参数

                        1. String getParameter(String name):根据参数名称获取参数值    username=zs&password=123

                        2. String[] getParameterValues(String name):根据参数名称获取参数值的数组  hobby=xx&hobby=game

                        3. Enumeration<String> getParameterNames():获取所有请求的参数名称

                        4. Map<String,String[]> getParameterMap():获取所有参数的map集合

        在这里可能会出现中文乱码的问题,只需要加一句:req.setCharacterEncoding("utf-8");

                2. 请求转发

                        1.获取跳转的对象,只能是服务器内的资源路径:RequestDispatcher getRequestDispatcher(String path)

                        2.调用.forward方法实现跳转:void forward(ServletRequest request, ServletResponse response)

                特点:1.只有一次请求;2.只能跳转到服务器内的资源;3.url地址栏中显示的是第一个访问的路径。

                        一般请求转发都使用链式编程:req.getRequestDispatcher("转发资源路径").forward(req.resp);

                3.共享数据

                域对象:在一次请求的过程中,数据是可以共享的。由于上面的数据转发就是一次请求,那么就是主要用在数据转发过程中。

        void setAttribute(String name, Object o):设置共享数据

        Object getAttribute(String name)  :获取共享数据

        void removeAttribute(String name)  :删除共享数据

                4.获得ServletContext对象

                        getServletContext():获得ServletContext对象

2.4BeanUtils

        这个东西的使用的作用是在Servlet中,将获取到的req的数据封装为JavaBean对象的,在这里,需要将获取到的数据存入Map集合。

Map<String, String[]> map = req.getParameterMap();
User user = new User();
try {
    BeanUtils.populate(user,map);
} catch (IllegalAccessException e) {
    e.printStackTrace();
} catch (InvocationTargetException e) {
    e.printStackTrace();      

}

2.5登录案例回想

        1.首先导入很多的资源,包括.html;.properties;和很多jar包;

        2.在数据库中创建数据,注意需要和druid.properties中的数据库对应;

        3.创建一个domain包,里面定义一个user类,包含表中的数据的JavaBean;

        4.创建一个UserDao类,里面提供一个Login方法,在里面写sq语句·,完成JDBCTemplate的操作;

        template.queryForObject(sql,new BeanF...<User>(User.class),login.getUsername,login.getPassword);

        5.在Servlet中创建对象,获取从html得到的数据并且封装为对象,然后使用login方法检验。检验成功就是共享数据加转发,检测失败就直接转发就行了。

3.总结

        有一个比较大的登陆案例没往上面粘贴,反正我又不会上传jar包。但是真是有点费工夫。至少通过今天的学习,他主要是在后期扮演者我在前端点击一个按钮或者啥的,能给我一个动态资源的。我需要回忆一下这个登陆案例。还有,我感觉要成。