Servlet

一、servlet的简单了解
1.浏览器通过url地址,访问web项目中的java代码
本质:通过浏览器向web服务器中某个地址发送http协议的请求(get或post等),让服务器自动调用某个对象的指定方法,从而让该方法执行完可以给本次http请求返回一个http响应。最后浏览器收到响应。最后浏览器收到响应后进行解析并显示用户结果。
url地址---》调用---》java对象中的方法(servlet技术)

2.新建web项目
选择Dynamic Web project-->不要直接选finlish,选next,勾选Generate web.xml,自动生成web.xml

3.web.xml文件:这个是web项目的配置文件,每个web项目都要有自己的配置文件(web.xml),同时这个web.xml文件内容是让tomcat服务器在启动期间来自动读取的
tomcat能自动读取web项目中的web.xml原因:
    1.web项目是在tomcat中部署的
    2.web项目结构是固定的


<servlet>
     <servlet-name>test</servlet-name>
     <servlet-class>com.briup.test.HelloWorld</servlet-class>
</servlet>
<servlet-mapping>
        <servlet-name>test</servlet-name>
        <url-pattern>/test</url-pattern>
    </servlet-mapping>

启动tomcat之后访问   http://127.0.0.1:8088/Test3/test

4.相关问题:
(1).web项目中的我们为什么没有编写程序入口(main)?
 web项目是不需要我们写main函数的,web项目启动会自动调用tomcat服务器或者其他应用服务器的main函数,然后通过web.xml的配置去加载其他类
 (2).我们编写的HelloWorld为什么可以称之为Servlet?
实现了Servlet接口
 (3).HelloWorld这个类的对象是谁创建的?
web容器创建的
 (4).当我们通过浏览器发请求访问HelloWorld对象的时候,tomcat会调用这个类的中的哪个方法来处理这个请求?
service方法
(5)servlet是单例,每一个servlet类只有一个对象,不同的客户端调用的都是同一个对象
(6). 容器启动的时候创建

二、servlet的编写
servlet:
servlet就是java类,这种java类可以提供web形式的访问
1.如何编写servlet
(1)实现Servlet接口(5个方法)
最重要的是实现接口中的service方法
(2)继承父类GenericServlet
另外重载了一个无参的init()方法
(3)继承HttpServlet
一般常用的浏览器发请求方式为get和post,这俩种方式分别对应了这个类中的doGet方法和doPost方法。


2.Servlet接口中的5个方法
//初始化servlet对象的时候被调用
void init(ServletConfig config)
//销毁servlet对象的时候被调用
void destroy()
//访问servlet对象的时候被调用
void service(ServletRequest req,ServletResponse res)
//返回servlet相关信息,比如作者、版本、版权等
//String getServletInfo()
//返回ServletConfig对象
ServletConfig getServletConfig()


3.servlet的访问
(1)在浏览器的地址栏中,直接输入servlet映射的路径来访问
 这时候是get方式的访问,servlet中的doGet方法最终会被调用
(2)在页面中,使用超链接来访问servlet
这时候是get方式的访问
(3)在页面中,可以使用表单发送请求去访问servlet
这时候默认情况下是get方式访问,但是可以通过表单里的属性值进行设置为get或者post方式
(4)将来还可以使用javascript或者在ajax中发请求访问servlet,这个时候也可以进行设置使用get方式还是post方式进行访问servlet

get方式传参数 参数在uri后面(uri和url的区别) 地址栏
        GET /hello.html?name=tom HTTP1.1
        key: value
        key: value
        key: value
        .....
        
uri统一资源标识符 用来唯一标识一个资源
url统一资源定位符,url比uri的资源多很多
url是uri的子集
    
    post方式传参 参数在请求正文中
        POST /hello.html HTTP1.1
        key: value
        key: value
        key: value
        .....
        
        name=tom
get post传参的区别:
get传参  参数在uri中; post传参  参数在请求正文中
get方式的参数由于在地址栏中显示的,所以安全性低一点,post方式传参的时候参数在请求正文中,会相对来说安全一些
get方式传参,参数长度是要看浏览器对地址栏中字符长度的限制;post方式参数,参数长度是要看服务器一次性最多能够接受并且处理多少数据


4.servlet接收客户端传的参数
不管客户端是post方式还是get方式传参,只是参数存放的位置在传输过程有所变化,但是对于servlet接收参数来讲,俩种情况都是一样的接收
    http://127.0.0.1:8080/jd1908-servlet/param?username=briup&password=briup&like=0&like=1
    下面的测试是在这样的传参中进行的
    http://127.0.0.1:8989/web_servlet/ParamServlet?name=tom&age=20&like=0&like=1

接收单一的值
request.getParameter("name");
一个参数名对应多个值
request.getParameterValues("like");
System.out.println(Arrays.toString(like));

获得本次传参中的所有参数名
Enumeration<String> names = request.getParameterNames();
        while(names.hasMoreElements()){
            String str = names.nextElement();
            System.out.println(str);
        }

Map<String, String[]> map = request.getParameterMap();
        for(String key:map.keySet()){
            System.out.println(key+" : "+Arrays.toString(map.get(key)));
        }
        打印结果:
        name : [tom]
        age  : [20]
        like : [0, 1]

5.客户端传参过程中,出现中文乱码
get方式乱码
需要在tomcat服务器中server.xml文件中进行配置
在<Connector>中加入新的属性URIEncoding="XXX"
<Connector URIEncoding="UTF-8" connectionTimeout="20000" port="8989" protocol="HTTP/1.1" redirectPort="8443"/>
post方式乱码
 request.setCharacterEncoding("UTF-8");
用io流写数据时乱码
 response.setCharacterEncoding("UTF-8");
//设置响应头部,告诉浏览器响应内容编码为utf-8
 response.setContentType("text/html;charset=utf-8");

6.servlet的跳转和重定向
(1)服务器内部跳转
String url = "/hello.html";//获得一个指向url的跳转对象
RequestDispatcher dispatcher = request.getRequestDispatcher(url);//进行跳转 跳转的同时把request和response转发给要跳转到的url
 dispatcher.forward(request, response);

特点:1.需要使用request对象来完成
        2.服务器内部跳转就是把请求request和响应response转发给下一个资源,所以整个跳转期间所有涉及到的资源使用的都是同一个request和同一个response。
        3.服务器跳转,不会改变地址栏中的地址


(2)客户端重定向
     客户端重定向到一个页面中或者一个servlet中
String url = "hello.html";
response.sendRedirect(url);
String url = "TestServlet";
 response.sendRedirect(url);

特点:1.需要使用response对象来完成
           2.每一个客户端重定向,浏览器都会发出新请求,在服务器内部会产生新的request对象和response对象
           3.客户端重定向,会改变浏览器地址栏的地址



    

原文地址:https://www.cnblogs.com/yxj808/p/12017869.html