通过自学尚硅谷的javaweb,学到了Servlet,现在将学到的一些知识和自己的一些总结放在scdn上,希望对你有所帮助 ,有什么不好、不对、落后的知识点,或者我这里面没有写到的,希望你能帮我指出。
2.5Servlet
2.5.1Servelet简介
1、Servlet是javaEE规范之一。规范就是接口
2、Servlet是javaweb三大组件之一。三大组件为:Servlet程序、Filter过滤器、Listener监听器
3、Servlet是运行在服务器上的java的小程序,它可以接受客户端发送过来的请求,并响应给客户端
2.5.2手动实现Servelet
1、编写一个类实现Servlet接口
2、实现service方法,处理请求,并响应数据
/**
* doGet()在get请求的时候调用
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("helloSerlvet的get请求");
ServletConfig servletConfig = getServletConfig();
System.out.println("HelloServlet程序的别名是:"+servletConfig.getServletName());
// 2、 获取初始化参数init-param
System.out.println("初始化参数username的值是:"+servletConfig.getInitParameter("username"));
System.out.println("初始化参数username的值是:"+servletConfig.getInitParameter("url"));
// 3、 获取ServletContext对象
System.out.println(servletConfig.getServletContext());
}
/**
* doGet()在Post请求的时候调用
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("helloSerlvet的post请求");
}
3、到web.xml中去配置Servlet程序的访问地址
<servlet>
<servlet-name>类名</servlet-name>
<servlet-class>全类名</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Servlet类名</servlet-name>
<url-pattern>/与类名对应关系</url-pattern>
</servlet-mapping>
<!--servlet标签给Tomcat配置servlet程序 -->
<servlet>
<!--servlet-name标签给Servlet程序起别名(一般是类名) -->
<servlet-name>HelloServlet</servlet-name>
<!--servlet-class标签是Servlet程序的全类名 -->
<servlet-class>com.sakura.Servlet.HelloServlet</servlet-class>
</servlet>
<!--servlet-mapping标签给servlet程序配置访问地址-->
<servlet-mapping>
<!--servlet-name标签的作用是告诉服务器,我档期配置的地址是给那个Servlet程序使用 -->
<servlet-name>HelloServlet</servlet-name>
<!--url-pattern标签配置访问地址
/ 斜杠在服务器解析过程时,表示地址为http://ip:port/工程路径
/hello 表示地址为http://ip:port/工程路径/hello
-->
<url-pattern>/hello</url-pattern>
</servlet-mapping>
<servlet>
4、将Tomcat中的工程路径修改掉,不然jsp无法显示内容,修改成工程名
5、在浏览器中,显示的jsp页面的http后加上设置的url-pattern名,则会出现结果
2.5.3Servlet-url地址定位到Servlet程序图解
2.5.3Servlet生命周期
1、执行Servlet构造器方法
public class HelloServlet implements Servlet {
public HelloServlet() {
System.out.println("1构造器方法");
}
2、执行init初始化方法
第1、2步,是在第一次访问的时候创建Servlet程序会调用
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("2init初始化方法");
// 1、 可以获取Servlet程序的别名servlet-name的值
System.out.println("HelloServlet程序的别名是:"+servletConfig.getServletName());
// 2、 获取初始化参数init-param
System.out.println("初始化参数username的值是:"+servletConfig.getInitParameter("username"));
System.out.println("初始化参数username的值是:"+servletConfig.getInitParameter("url"));
// 3、 获取ServletContext对象
System.out.println(servletConfig.getServletContext());
}
3、执行service方法
第三步,每次访问都会被调用
- 执行destroy销毁方法
第四步,在web工程停止的时候调用
2.5.4请求的分发处理
在idea中可以直接生成servlet,
1、因为html中存在表单,需要有提交方法,get和post,为了得到提交方式,在
Servlet构造器中,实现HttpServletRequest方法得到getMethod()方法,在控制台输出提交方式:
/**
* service方法是专门用来处理请求和响应的
* @param servletRequest
* @param servletResponse
* @throws ServletException
* @throws IOException
*/
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("3service方法");
//类型转换 (因为它有getMethod()方法)
HttpServletRequest httpServletRequest=(HttpServletRequest) servletRequest;
//获取请求方式
String method=httpServletRequest.getMethod();
//System.out.println(method);//GET|POST
if("GET".equals(method)){
doGET();
}else if("POST".equals(method))
doPOST();
}
2、通过继承HttpServlet实现Servlet程序
①编写一个类去继承HttpServlet类
-
- 根据业务需要重写doGet或doPost方法,通过alt+insert
-
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("helloSerlvet的get请求");} @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("helloSerlvet的post请求"); }
- 到web.xml中的配置Servlet程序的访问地址
2.5.5Servlet类的继承体系
自定义Servlet程序—继承—>HttpServlet—继承—>GenericServlet—实现接口—>Servlet
Servlet接口:只是负责实现Servlet程序的访问规范。
GenericServlet类:实现了Servlet接口。做了很多空实现。并持有一个ServletConfig类的引用。并对ServletConfig的使用做了一些方法。
HttpServlet抽取类:实现了service()方法,并实现了请求的分发的处理
String method=req.getMethod();
会获得GET(doGet()) POST(doPost())——>这两个方法负责抛异常,说不支持GET/POST请求
自定义的Servlet程序:我们只需要根据自己的业务需要去重写doGet和doPost方法即可(重写doGet和doPost)
2.5.6ServletConfig类
ServletConfig类时Servlet程序的配置信息类
对于ServletConfig的补充说明,当子类重写了init()方法后,若在Servlet类中调用了ServletConfig但是并没有在init()中实现ServletConfig,则会报空指针异常,所以需要在init中重写父类的方法(super(config))
Eg:当在doGet中调用了getServletConfig()方法,并想调用Servletconfig的方法则只能获得Servlet的别名以及值,而参数列表返回值都为null
而当重写了init()方法时并且没有super父类时,则会报空指针异常
Servlet程序和ServletConfig对象都是有Tomcat负责创建,我们负责使用。
Servlet程序默认是第一次访问的访问的时候创建,ServletConfig是每个Servlet程序创建时,就创建一个对应的ServletConfig对象
ServletConfig的三个作用
- 可以获取Servlet程序的别名servlet-name的值
// 1、 可以获取Servlet程序的别名servlet-name的值
System.out.println("HelloServlet程序的别名是:"+servletConfig.getServletName());
2.获取初始化参数init-param:可在web.xml中设置多个参数
// 2、 获取初始化参数init-param
System.out.println("初始化参数username的值是:"+servletConfig.getInitParameter("username"));
System.out.println("初始化参数username的值是:"+servletConfig.getInitParameter("url"));
3.获取ServletContext对象
// 3、 获取ServletContext对象
System.out.println(servletConfig.getServletContext());
完整方法代码为:
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("2init初始化方法");
// 1、 可以获取Servlet程序的别名servlet-name的值
System.out.println("HelloServlet程序的别名是:"+servletConfig.getServletName());
// 2、 获取初始化参数init-param
System.out.println("初始化参数username的值是:"+servletConfig.getInitParameter("username"));
System.out.println("初始化参数username的值是:"+servletConfig.getInitParameter("url"));
// 3、 获取ServletContext对象
System.out.println(servletConfig.getServletContext());
}
最后结果显示:
2.5.7ServletContext类
ServletContext是一个接口,它表示Servlet上下文对象,并且一个web工程只有一个ServletContext对象实例。
ServletContext对象是一个域对象。
ServletContext是在web工程部署启动的时候创建的,在web工程停止的时候被销毁。
域对象:是可以像Map一样存储数据的对象,域是存储数据的操作范围。
存储数据 取数据 删除数据
Map put() get() remove()
域对象 setAttribute() getAttribute() removeAttribute()
- ServletContext类的作用
ServletContext servletContext = getServletConfig().getServletContext();
- 获取web.xml中配置的上下文参数context-param
可以在web.xml可以写多个context-param
<!--context-param是上下文参数(它属于整个web工程) -->
<context-param>
<!--param-name参数名 -->
<param-name>username</param-name>
<!--param-value参数值 -->
<param-value>context</param-value>
</context-param>
<context-param>
<param-name>password</param-name>
<param-value>root</param-value>
</context-param>
// (1) 获取web.xml中配置的上下文参数context-param
ServletContext servletContext = getServletConfig().getServletContext();
String username = servletContext.getInitParameter("username");
System.out.println("Context-param参数的username的值是"+username);
String password = servletContext.getInitParameter("password");
System.out.println("Context-param参数的password的值是"+password);
- 获取当前的工程路径 http://ip:port//工程路径
// (2) 获取当前的工程路径 http://ip:port//工程路径
System.out.println("当前工程路径:"+servletContext.getContextPath());
- 获取工程部署后在服务器硬盘上的绝对路径
会直接映射到idea下的web目录
// (2) 获取当前的工程路径 http://ip:port//工程路径
System.out.println("当前工程路径:"+servletContext.getContextPath());
// (3) 获取工程部署后在服务器硬盘上的绝对路径,映射到IDEA的web目录
System.out.println("工程部署的路径是:"+servletContext.getRealPath("/"));
System.out.println("工程下css目录的绝对路径是:"+servletContext.getRealPath("/css"));
像Map一样存储数据
-
// (4) 像Map一样存储数据 servletContext.setAttribute("key1","value"); System.out.println("servletContext的获取域数据key1的"+servletContext.getAttribute("key1")); System.out.println("servletContext的获取域数据key1的"+servletContext.getAttribute("servletContext_1"));
说明:因为整个web工程下只会存在一个ServletContext实例,则在web中不管创建了多少个ServletContext,它们的地址都是相同的,通过get和setAttribute设置和获得的值都是一样的,但是当我们停止了或者重启了Tomcat,则ServletContext实例也会被销毁,只有再次启动重新setAttribute可以再次为ServletContext赋值
2.5.8Http协议
协议:指双方或多方,相互约定好,大家都需要遵守的规则。
Http协议:客户端和服务器之间通信是,发送的数据,需要遵守的规则。
Http协议传输的数据叫做报文。
1、请求的Http协议格式
(1)客户端给服务器发送数据叫请求,服务器给客户端回传数据交响应
(2)请求分为GET请求和POST请求
1.1 GET请求
①请求行
(1)请求的方式 GET
(2)请求的资源路径[+?+请求参数]
(3)请求的协议的版本号 HTTP/1.1
②请求头
Key:value 组成 不同的键值对,表示不同的含义
1.2 POST请求
①请求行
(1)请求的方式 POST
(2)请求的资源路径[+?+请求参数]
(3)请求的协议的版本号 HTTP/1.1
②请求头
-
- Key:value 组成 不同的键值对,表示不同的含义
空行
③请求体
就是发送给服务器的数据
1.3 常用请求头的说明
Accept:表示客户端可以接收的数据类型
Accept-Language:表示客户端可以接受的语言类型
User-Agent:表示客户端浏览器的信息
Host:表示请求时的服务器ip和端口号
2.5.9 GET请求和POST请求分类
GET请求
- form标签的 method=get
- a标签
- link标签引入css
- Script标签引入js文件
- img标签引入图片
- iframe引入html页面
- 在浏览器地址栏中输入地址后敲回车
POST请求
- form标签 method=post
2.5.10 响应的HTTP协议格式
1、响应行
(1)响应的协议和版本号 HTTP/1.1
(2)响应状态码 200
(3)响应状态的描述符 ok
2、响应头
(1)key:value 不同的响应头,有不同的含义
空行
3、响应体
就是回传给客户端的数据
常见的响应码的说明
200 表示请求成功 302 表示请求重定向
404 请求服务器已经收到了,但是你要的数据不存在(请求地址错误)
500 表示服务器已经收到请求,但是服务器内部错误(代码错误)
2.5.11 MIME类型说明
MIME是HTTP协议中数据类型
MIME的英文全程是“Multipurpose Internet Mail Extension”多功能Internet邮件扩充服务。MIME类型的格式是“大类型/小类型”,并与某一种文件的扩展名相对应
2.5.12 HttpServletRequest类
1、作用:每次只要有请求进入Tomcat服务器,Tomcat服务器就会把请求过来的HTTP协议信息解析好封装到Request对象中。然后传递到service方法(doGet和doPost)中给我们使用。我们可以通过HttpServletRequest对象,获取到所用请求的信息。
2、常用方法:
(1)getRequestURI() 获取请求的资源路径
System.out.println("URI=>"+req.getRequestURI());
(2)getRequestURL() 获取请求的统一资源定位符(绝对路径)
System.out.println("URL=>"+req.getRequestURL());
(3)getRemoteHost() 获取客户端的IP地址
使用localHost访问时,得到的客户端ip地址是:0:0:0:0:0:0:0:1(ipV6的地址)
使用127.0.0.1访问时,得到的客户端ip地址是:127.0.0.1
使用真实ip访问时,得到的客户端ip地址是:真实的客户端ip地址
System.out.println("客户端的IP地址"+req.getRemoteHost());
(4)getHeader() 获取请求头
System.out.println("请求头User-Agent=>"+req.getHeader("User-Agent"));
(5)getparameter() 获取请求的参数
(6)getParameterValues() 获取请求的参数(多个值的时候使用)
首先先配置web.xml文件,然后在写好表单,需要的内容。
req.setCharacterEncoding("utf-8");
// getparameter() 获取请求的参数
String username = req.getParameter("username");
String password = req.getParameter("password");
String[] hobby = req.getParameterValues("hobby");
System.out.println("用户名"+username+"密码"+password+"爱好"+ Arrays.asList(hobby));
// getParameterValues() 获取请求的参数(多个值的时候使用)
获得表单中响应name的属性,最后由服务器返回值
当hobby使
则这个时候需要改成req.getParameterValues(),hobby也需要改成一个String类型的数组,最后用Arrays.asList(hobby)
补充问题:
在提交方式为get时,username为中文和英文都可以直接通过编译
而当提交方式为post时,username为英文可以通过,而为中文时则会直接405或者通过编译但是是乱码,这个时候需要在继承HttpServlet的doPost方法中使用req.setCharaterEncoding("utf-8")这样才能将信息发送至服务器或是编译通过。
req.setCharacterEncoding("utf-8");
此方法需要在请求参数之前调用,否则就会出现中文乱码的问题
(7)getMethod() 获取请求的方式GET或POST
System.out.println("获取请求的方式=>"+req.getMethod());
(8)setAttribute(key,value)设置域数据
(9)getAttribute(key) 获取域数据
(10)getRequestDispatcher()获取转发对象
用的是req.getParameter()方法时为多选框,当爱好多选是,则只能获得第一个的选项
今天累了,明天继续更新
剩余部分的链接:javaWeb学习路线——Servlet(2)