黑马程序员技术交流社区
标题:
【石家庄校区】JavaEE个人学习总结4day10Servlet
[打印本页]
作者:
sun2ice
时间:
2018-2-4 15:56
标题:
【石家庄校区】JavaEE个人学习总结4day10Servlet
#day10Servlet
##Servlet的概述
*
运行在WEB服务器上的小的java程序用来接收和响应从客户端发送过来的请求,通常使用HTTP协议
*
是SUN公司提供的一个动态网页开发技术
*
作用: 处理从客户端浏览器发送的请求,并对请求做出响应
*
使用
*
定义一个类实现servlet的接口/继承HttpServlet
*
去web.xml中配置虚拟路径
*
Servlet
`servlet-name servlet-class`
*
Servlet-mapping
`servlet-name url-pattern`
##配置:
```
<!-- 配置Servlet -->
<servlet>
<!-- Servlet的名称 -->
*<servlet-name>test1</servlet-name>
<!-- SErvlet的全路径 -->
* <servlet-class>com.itheima.a_servlet.ServletDemo1</servlet-class>
</servlet>
<!-- Servlet的映射 -->
<servlet-mapping>
<!-- Servlet的名称 -->
* <servlet-name>test1</servlet-name>
<!-- Servlet的访问路径 -->
* <url-pattern>/ServletDemo1</url-pattern>
</servlet-mapping>
* 访问:
http://localhost:8080/day09/ServletDemo1
```
##使用Servlet接收参数
*
`String getParameter(String name);`
---用于接收一个名称对应一个值的数据.
*
`String[] getParameterValues(String name);`
---用于接收一个名称对应多个值的数据.
*
`Map getParameterMap();`
---用于接收表单中的所有的数据,Map的key是表单提交的参数名称,Map的value是提交参数的值.
*
`Enumeration getParameterNames()`
---用于获取表单中提交的所有的参数的名称.
##Servlet的声明周期
*
生命周期就是一个对象从创建到销毁的过程
```
* Servlet
* 何时创建:用户第一次访问Servlet 创建 Servlet的实例(对象)
* 何时销毁:当项目从服务器中移除的时候 ,或者关闭服务器的时候
* 用户第一次访问Servlet的时候,服务器会创建一个Servlet的实例,那么Servlet中 init 方法就会执行,任何一次请求服务器都会创建一个新的线程访问Servlet中的service的方法,在service方法内部根据请求的方式的不同调用doXXX的方法.(get请求调用doGet,post请求调用doPost).
* 当Servlet中服务器中移除掉,或者关闭服务器,Servlet的实例就会被销毁,那么destroy方法就会执行.
```
#Servlet的相关配置
*
启动时创建Servlet
*
在web.xml中在在web.xml中在<servlet></servlet>标签中配置:
*
` <load-on-startup>2</load-on-startup> `
--- 传入正整数,整数越小,被创建的优先级就越高.注意从2开始
*
url-pattern虚拟路径的配置
*
方式一: 完全路径
*
方式二: 目录匹配
*
方式三: 扩展名匹配 不能使用/开头
##开发中的路径的编写:
*
绝对路径----建议使用绝对路径---/开头/项目资源/
*
相对路径----不能使用/开头
##ServletContext 域对象:(重要)-被多个用户共享.
###ServletContext对象存取数据,存的数据都是有一定的作用的范围的.这种对象称为是域对象.
*
在服务器启动的时候ServletContext就会被创建.一个WEB项目创建一个ServletContext对象.在服务器关闭的时候销毁
`.ServletContext context = this.getServletContext();`
*
域对象-存的数据有作用范围.
*
功能:
*
1.获得文件的MIME的类型.
*
2.获得全局初始化参数.
*
3.存取数据-作为域对象来使用.
*
4.读取WEB项目的文件:
###1.获得文件的MIME的类型.
*
`this.getServletContext().getMimeType("1.html") 返回string`
### 2.获得全局初始化参数.
```
配置全局初始化参数:
<context-param>
<param-name>username</param-name>
<param-value>root</param-value>
</context-param>
<context-param>
<param-name>password</param-name>
<param-value>123</param-value>
</context-param>
String username = this.getServletContext().getInitParameter("username");
String password = this.getServletContext().getInitParameter("password");
```
###3.存取数据-作为域对象来使用.**
*
`setAttribute(String name,String value);用来存取数据:`
*
`getAttribute(String name);用来向ServletContext中存入数据.`
*
`removeAttribute(String name);用来从ServletContext中获取数据.`
###4.读取WEB项目的文件:
*
`getResourceAsStream(String path);根据提供路径读取文件返回一个文件的输入流.`
*
`getRealPath(String path);返回一个路径的磁盘绝对路径.`
##Http协议中的Response信息
*
Response 代表响应的对象,从服务器向浏览器输出内容
*
响应行
*
`setStaus(int) 状态码`
*
响应头
*
`setHeader(String name,String value);`
--- 针对一个key对应一个value的响应头.
*
`setDateHeader(String name,long date);`
*
`setIntHeader(String name,int value);`
*
响应体
*
做出响应的时候只能使用其中的一种流响应
*
`getOutputStream()`
*
`gerWriter()`
##文件下载
*
方式一: 超链接下载,直接将文件路劲写到超链接写到href中 前提 文件类型浏览器支持
*
方式二: 手动编写代码下载
*
设值两个头和一个流
*
`Content-Type Mime类型 文件的MIME的类型`
*
`Content-Disposition 以下载的形式打开文件\`
*
`InputStream 文件的输入流 `
##接收参数的中文乱码的处理:
*
GET :
`new String(“”.getBytes(“ISO-8859-1”),”UTF-8”)`
*
POST :
`request.setCharacterEncoding(“UTF-8”); `
##服务器向浏览器输出中文的时候乱码解决???
```
设置响应头
响应头的编码是固定的ISO-8859-1,所有我们需要给浏览器能看懂的东西
if(header.contains("Firefox")){
filename = base64EncodeFileName(filename);
}else{
filename = URLEncoder.encode(filename, "UTF-8");
}
public static String base64EncodeFileName(String fileName) {
BASE64Encoder base64Encoder = new BASE64Encoder();
try {
return "=?UTF-8?B?"
+ new String(base64Encoder.encode(fileName
.getBytes("UTF-8"))) + "?=";
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
设置响应体
方式1 response.setContentType("text/html;charset=UTF-8)"
```
##Http协议中的Request信息
*
使用request获得客户机的信息.
`getRemoteAddr(),getMethod(),getRequestURL()`
*
获得请求参数
`:getParameter(),getParameterValues(),getParameterMap()`
*
作为域对象存取数据:
` setAttribute(),getAttribute(),removeAttribute();`
*
获取项目名
`request.getContextPath()`
*
request何时创建和销毁的?
*
创建:从客户端向服务器发送请求.那么服务器创建一个request对象.
*
销毁:服务器为这次请求作出了响应之后,服务器就会销毁request对象.
*
作用范围:一次请求.
##重定向和转发的区别:(redirect和forward的区别)
*
1.重定向的地址栏会发生变化,转发的地址栏不变.
*
2.重定向两次请求两次响应,转发一次请求一次响应.
*
3.重定向路径需要加工程名,转发的路径不需要加工程名.
*
4.重定向可以跳转到任意网站,转发只能在服务器内部进行转发.
*
转发
` request.getRequestDispatcher("/路径 不需要项目名").forward(request, response);`
*
`重定向response.sendRedirect("/路径 需要项目名");`
##向浏览器要东西用request 给东西用response
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2