WEB请求与响应解析
- URL统一资源定位符,表示Web应用对外暴露的访问地址
- 示例:http://www.imooc.com/index.html
- URI统一资源标识符,表示Web应用资源的访问路径
- 示例:/index.html
请求的结构
HTTP请求包含三部分:请求行、请求头、请求体
利用请求开发多端应用
代码语言:javascript复制@WebServlet("/ua")
public class UesrAgentServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 得到请求结构 User-Agent中的属性
String ua = request.getHeader("User-Agent");
String output = "";
// 判断获取的参数
if (ua.toLowerCase().indexOf("iphone") != -1 || ua.toLowerCase().indexOf("android") != -1) {
output = "<h1>这是移动端页面</h1>";
} else if (ua.toLowerCase().indexOf("windows nt") != -1) {
output = "<h1>这是PC端页面";
}
// 设置为UTF-8字符集
response.setContentType("text/html;charset=utf-8");
response.getWriter().println(output);
}
}
响应的结构
HTTP响应包含三部分:响应行、响应头、响应体
HTTP常见状态码
ContentType的作用
ContentType 决定浏览器采用何种方式对响应体进行处理
请求转发与响应重定向
多个Servlet之间跳转有两种方式:
- request.getRequestDispatchar().forward():请求转发
- response.sendRedirect():响应重定向
请求转发
请求转发是服务器跳转,只会产生一次请求
响应重定向
重定向则是浏览器端跳转,会产生两次请求
设置请求自定义属性
请求允许创建自定义属性
设置请求:request.setAttribute(属性名,属性值)
获取请求属性: Object attr = request.getAttribute(属性名)
Session与ServletContext原理
浏览器cookie
Cookie 是浏览器保存在本地的文本内容。Cookie默认域名绑定,只有当前域名下的程序才能读取数据。Cookie具有时效性,Cookie会伴随请求头发送给服务器。
Cookie的时效性有两种情况:
- 默认Cookie有效期与当前浏览器进程绑定
- 设置过期时间后,Cookie过期后才会时效
/**
* 用于生成随机数的Cookie
*/
@WebServlet("/cookie/random")
public class RandomServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 获取随机整数
Integer random = new Random().nextInt(10000);
Cookie cookie = new Cookie("random", String.valueOf(random));
// 设置Cookie时效
cookie.setMaxAge(60*60*24);
// 将cookie添加到响应中
response.addCookie(cookie);
// 设置内容类型
response.setContentType("text/htmll;charset=utf-8");
response.getWriter().write("<h2>Random:" random "已生成</h2>");
}
}
代码语言:javascript复制/**
* 读取Cookie
*/
@WebServlet("/cookie/show")
public class CookieServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 获取Cookie
Cookie[] cookies = request.getCookies();
response.setContentType("text/html;charset=utf-8");
if (cookies == null) {
response.getWriter().println("未生成Cookie");
}
Integer random = -1;
for (Cookie c : cookies) {
if (c.getName().equals("random")) {
random = Integer.parseInt(c.getValue());
}
}
response.getWriter().write("<h3>Random:" random "</h3>");
}
}
Session 用户会话
Session(用户会话)用于保存与“浏览器窗口”对应的数据 Session的数据存储在Tomcat服务器的内存中,具有时效性 Session通过浏览器Cookie的Sessionld值提取用户数据
Session常用方法
request.getSession()
-获取Session对象
get|set|removeAttribute()
-获取|设置|删除Session属性
setMaxlnactivelnterval()
-设置Session超时时间
@WebServlet("/session/random")
public class RandomServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Integer random = new Random().nextInt(100000);
// 获取当前请求绑定的Session对象
HttpSession session = request.getSession();
session.setAttribute("random", random);
response.setContentType("text/html;charset=utf-8");
response.getWriter().write("<h2>随机数:" random "已生成</h2>");
}
}
代码语言:javascript复制@WebServlet("/session/show")
public class SessionServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession();
// 获取Session属性
int random = (Integer) session.getAttribute("random");
response.setContentType("text/html;charset=utf-8");
response.getWriter().println("随机数:" random);
}
}
ServletContext与三大作用域对象
ServletContext(Servlet上下文对象),是Web应用全局对象 一个Web应用只会创建一个ServletContext对象 ServletContext随着Web应用启动而自动创建
Java Web三大作用域 | 从小到大(降序排序) |
---|---|
HttpServletRequest | 请求对象 |
HttpSession | 用户会话对象 |
ServletContext | Web应用全局对象 |
Servlet开发应用实践
解决中文乱码
发送方与接收方对数据使用不同的字符集解析就会产生乱码,解决乱码的思路是保证浏览器与服务器统一为UTF-8编码即可
Toncat 8以后的版本字符集默认为UTF-8
Tomcat 8以前的版本默认字符集为ISO-8859-1,需要在server.xml配置字符集:URIEncoding=“UTF-8”
代码语言:javascript复制@WebServlet("/encoding/search")
public class ServletSearch extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// Toncat 8以后的版本字符集默认为UTF-8
// Tomcat 8以前的版本默认字符集为ISO-8859-1,需要在server.xml配置字符集:URIEncoding=“UTF-8”
String keywork = request.getParameter("keywork");
System.out.println(keywork);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 利用UTF-8编码解析请求体中的请求参数
request.setCharacterEncoding("UTF-8");
String keywork = request.getParameter("keywork");
System.out.println(keywork);
}
}
web.xml配置默认首页与通配符映射
代码语言:javascript复制<!--默认首页设置-->
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>default.html</welcome-file>
</welcome-file-list>
通配符映射
代码语言:javascript复制<servlet>
<servlet-name>pattern</servlet-name>
<servlet-class>hua.pers.servlet.PatternServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>pattern</servlet-name>
<!--http://www.imooc.com/class/786 -->
<url-pattern>/class/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>pattern</servlet-name>
<!-- http://www.imooc.com/786.class -->
<url-pattern>/*.class</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>pattern</servlet-name>
<!--对所有请求进行映射,Spring MVC框架中会使用到这个特性-->
<url-pattern>/</url-pattern>
</servlet-mapping>
代码语言:javascript复制public class PatternServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//url:/class/786
String uri = request.getRequestURI();
String id = uri.substring(uri.lastIndexOf("/") 1);
}
Servlet启动时加载与错误页面设置
Servlet启动时加载
代码语言:javascript复制web.xml使用设置启动加载 0~9999 启动时加载在工作中常用与系统的预处理
<servlet>
<servlet-name>inittable</servlet-name>
<servlet-class>hua.pers.servlet.startup.InitTableServlet</servlet-class>
<init-param>
<param-name>database</param-name>
<param-value>db01</param-value>
</init-param>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet>
<servlet-name>import</servlet-name>
<servlet-class>hua.pers.servlet.startup.ImportServlet</servlet-class>
<init-param>
<param-name>file</param-name>
<param-value>c:/tmp.txt</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
代码语言:javascript复制public class InitTableServlet extends HttpServlet {
@Override
public void init(ServletConfig config) throws ServletException {
String database = config.getInitParameter("database");
System.out.println("正在向" database "创建数据表...");
}
}
代码语言:javascript复制public class ImportServlet extends HttpServlet {
@Override
public void init(ServletConfig config) throws ServletException {
String file = config.getInitParameter("file");
System.out.println("正在导入" file "数据...");
}
}
错误页面
代码语言:javascript复制<error-page>
<error-code>404</error-code>
<location>/error/404.html</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/error/500.html</location>
</error-page>
打包与发布
代码语言:javascript复制<!--决定压缩式的jar包还是war包-->
<packaging>war</packaging>
<!--依赖jar-->
<dependencies>
<dependency>
<groupId>xxx</groupId>
<artifactId>xxx</artifactId>
<version>x.x.x</version>
<scope>provided</scope>
</dependency>
</dependencies>
<!-- 设置包名 -->
<build>
<finalName>名字</finalName>
</build>
<b
在server.xml 文件增加配置
不然会以默认的文件夹名web-servlet访问