Get和Post区别
- GET 方法有大小长度限制:请求字符串中最多有1024个字符(1KB)
- POST 方法 各个表单字段元素及其数据作为 HTTP 消息的实体内容发送给 WEB 服务器,传送的数据量要比使用GET方式传送的数据量大得多。
1、Servlet容器
运行 Servlet、JSP、Filter 等的软件环境。
- 可以创建 Servlet 实例,并调用Servlet相关的生命周起方法。
- JSP、Filter、Listener,Tag...
2、Servlet的生命周期方法
1.构造器:只被调用一次,只有第一次请求 Servlet 时,创建 Servlet 实例,调用构造器(这说明 Servlet 是单例的)
2.init 方法:只被调用一次。在创建好实例后立即被调用, 用于初始化当前的 Servlet 实例,简单的创建一些用于整个生命周期的数据
3.Service 方法:被多次调用。每次请求都会调用 Service 方法,实际用于处理客户端的请求。(检查HTTP请求类型(GET、POST、PUT、DELETE等),并在适当的时候调用doGet、doPost、doPut、doDelete 等方法。)
4.destory:只被调用一次,在当前 Servlet 所在的Web应用被卸载时调用,用于释放当前 Servlet 所占用的资源。
3、Servlet 的 HelloWrold:
- 创建一个 Servlet 接口的实例;
- 在 web.xml 中配置和映射这个 Servlet:
<!-- 配置和映射 Servlet -->
<servlet>
<!-- Servlet 注册的名字 -->
<servlet-name>helloServlet</servlet-name>
<!-- Servlet 的全类名 -->
<servlet-class>com.wbc.j2ee.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<!-- 需要和某一个 servlet 节点的 serlvet-name 子节点的文本节点一致 -->
<servlet-name>helloServlet</servlet-name>
<!-- 映射具体的访问路径: / 代表当前 WEB 应用的根目录. -->
<url-pattern>/hello</url-pattern>
</servlet-mapping>
4、load-on-startup 参数
配置在 servlet 节点中:指定Servlet被创建的时机。若为负数,则第一个请求时被创建。若为正数或0,则在当前WEB应用被Servlet 容器加载时创建实例,且数值越小越早被创建。
<servlet>
<!-- Servlet 注册的名字 -->
<servlet-name>xxx</servlet-name>
<!-- Servlet 的全类名 -->
<servlet-class>xxxxx</servlet-class>
<!-- 可以指定 Servlet 被创建的时机 -->
<load-on-startup>2</load-on-startup>
</servlet>
5、关于Servlet-mapping:
- 同一个Servlet可以被映射到多个URL上,即多个<servlet-mapping>元素的<servlet-name>子元素的设置值可以是同一个Servlet的注册名。
- 在Servlet映射到的URL中也可以使用通配符,但是只能有两种固定的格式:一种格式是“.扩展名”,另一种格式是以正斜杠(/)开头并以“/*”结尾。
<servlet-mapping>
<servlet-name>secondServlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
OR
<servlet-mapping>
<servlet-name>secondServlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
注意: 以下的既带 / 又带扩展名的不合法.
<servlet-mapping>
<servlet-name>secondServlet</servlet-name>
<url-pattern>/*.action</url-pattern>
</servlet-mapping>
6、ServletConfig
1. 配置 Serlvet 的初始化参数
<servlet>
<servlet-name>helloServlet</servlet-name>
<servlet-class>xxx.xxx.HelloServlet</servlet-class>
<!-- 配置 Serlvet 的初始化参数。 且节点必须在 load-on-startup 节点的前面 -->
<init-param>
<!-- 参数名 -->
<param-name>user</param-name>
<!-- 参数值 -->
<param-value>root</param-value>
</init-param>
<init-param>
<param-name>password</param-name>
<param-value>1230</param-value>
</init-param>
<load-on-startup>-1</load-on-startup>
</servlet>
2. 获取初始化参数
getInitParameter(String name): 获取指定参数名的初始化参数
getInitParameterNames(): 获取参数名组成的 Enumeration 对象.
String user = servletConfig.getInitParameter("user");
System.out.println("user: " + user);
Enumeration<String> names = servletConfig.getInitParameterNames();
while(names.hasMoreElements()){
String name = names.nextElement();
String value = servletConfig.getInitParameter(name);
System.out.println("^^" + name + ": " + value);
}
7、ServletContext
代表当前WEB应用,是当前WEB应用的一个大管家,可以从中获取WEB应用各个方面的信息 可以由 SerlvetConfig 获取:
ServletContext servletContext = servletConfig.getServletContext();
1. 获取当前 WEB 应用的初始化参数
(设置初始化参数: 可以为所有的 Servlet 所获取, 而 Servlet 的初始化参数只用那个 Serlvet 可以获取.)
<!-- 配置当前 WEB 应用的初始化参数 -->
<context-param>
<param-name>driver</param-name>
<param-value>com.mysql.jdbc.Driver</param-value>
</context-param>
方法: getInitParameter、getInitParameterNames
ServletContext servletContext = servletConfig.getServletContext();
String driver = servletContext.getInitParameter("driver");
System.out.println("driver:" + driver);
Enumeration<String> names2 = servletContext.getInitParameterNames();
while(names2.hasMoreElements()){
String name = names2.nextElement();
System.out.println("-->" + name);
}
2. 获取当前 WEB 应用的某一个文件在服务器上的绝对路径, 而不是部署前的路径:
getRealPath(String path);
String realPath = servletContext.getRealPath("/note.txt");
System.out.println(realPath);
- 获取当前 WEB 应用的名称: ** getContextPath()**
String contextPath = servletContext.getContextPath();
System.out.println(contextPath);
3. 利用ServletContext对象读取资源文件(比如properties文件)
getResourceAsStream(String path): path 的 / 为当前 WEB 应用的根目录.
读取资源文件要根据资源文件所在的位置来决定,一般分为以下两种情况:
- 文件在WebRoot文件夹下,即Web应用的根目录。这时候我们可以使用ServletContext来读取该资源文。
假设我们Web根目录下有一个配置数据库信息的dbinfo.properties文件,里面配置了name和password属性,这时候可以通过ServletContext去读取这个文件:
// 这种方法的默认读取路径就是Web应用的根目录
InputStream stream = this.getServletContext().getResourceAsStream("dbinfo.properties");
// 创建属性对象
Properties properties = new Properties();
properties.load(stream);
String name = properties.getProperty("name");
String password = properties.getProperty("password");
out.println("name="+name+";password="+password);
- 如果这个文件放在了src目录下,这时就不能用ServletContext来读取了,必须要使用类加载器去读取
// 类加载器的默认读取路径是src根目录
InputStream stream = MyServlet.class.getClassLoader().getResourceAsStream("dbinfo.properties")
如果这个文件此时还没有直接在src目录下,而是在src目录下的某个包下,比如在com.gavin包下,此时类加载器要加上包的路径,如下:
InputStream stream = MyServlet.class.getClassLoader().getResourceAsStream("com/gavin/dbinfo.properties")
补充一点,ServletContext只有在读取的文件在web应用的根目录下时,才能获取文件的全路径。比如我们在WebRoot文件夹下有一个images文件夹,images文件夹下有一个Servlet.jpg图片,为了得到这个图片的全路径,如下:
// 如何读取到一个文件的全路径,这里会得到在Tomcat的全路径
String path = this.getServletContext().getRealPath("/images/Servlet.jpg");
8、Servlet中获取请求消息
1、Servlet 的 service() 方法用于应答请求: 因为每次请求都会调用 service() 方法
public void service(ServletRequest request, ServletResponse response)
throws ServletException, IOException
- ServletRequest: 封装了请求信息. 可以从中获取到任何的请求信息.
- ServletResponse: 封装了响应信息, 如果想给用户什么响应, 具体可以使用该接口的方法实现.
2、 ServletRequest: 封装了请求信息. 可以从中获取到任何的请求信息.
-
获取请求参数:
String getParameter(String name): 根据请求参数的名字, 返回参数值. 若请求参数有多个值(例如 checkbox), 该方法只能获取到第一个提交的值.
String[] getParameterValues(String name): 根据请求参数的名字, 返回请求参数对应的字符串数组.
Enumeration getParameterNames(): 返回参数名对应的 Enumeration 对象, 类似于 ServletConfig(或 ServletContext) 的 getInitParameterNames() 方法.
Map getParameterMap(): 返回请求参数的键值对: key: 参数名, value: 参数值, String 数组类型.
-
获取请求的 URI:
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
String requestURI = httpServletRequest.getRequestURI();
System.out.println(requestURI);
- 获取请求方式:
String method = httpServletRequest.getMethod();
System.out.println(method); //GET
- 若是一个 GET 请求, 获取请求参数对应的那个字符串, 即 ? 后的那个字符串.
String queryString = httpServletRequest.getQueryString();
System.out.println(queryString);
//user=atguigu&password=123456&interesting=game&interesting=party&interesting=shopping
- 获取请求的 Serlvet 的映射路径
String servletPath = httpServletRequest.getServletPath();
System.out.println(servletPath); // /loginServlet
- 和 attribute 相关的几个方法:
3、HttpServletRequest: 是 SerlvetRequest 的子接口. 针对于 HTTP请求所定义.里边包含了大量获取 HTTP 请求相关的方法.
4、ServletResponse: 封装了响应信息, 如果想给用户什么响应, 具体可以使用该接口的方法实现.
- getWriter(): 返回 PrintWriter 对象. 调用该对象的 print() 方法, 将把 print() 中的参数直接打印 到客户的浏览器上.
- 设置响应的内容类型: response.setContentType("text/html");
- void sendRedirect(String location): 请求的重定向. (此方法为 HttpServletResponse 中定义.)