HTTP请求结构
- HTTP请求包含三部分:请求行,请求头,请求体
巧用请求头开发多端应用
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
String userAgent=request.getHeader("User-Agent");
response.setContentType("text/html;charset=utf-8");
response.getWriter().println(userAgent);
String output = "";
if(userAgent.indexOf("Windows NT")!= -1) {
output = "<h1>这是pc端首页</h1>";
}else if (userAgent.indexOf("iPhone")!= -1) {
output = "<h1>这是iPhone端首页</h1>";
}else if (userAgent.indexOf("Android")!= -1) {
output = "<h1>这是Android端首页</h1>";
}
response.getWriter().println(output);
}
响应结构
- HTTP响应包含三部分:响应行、响应头、响应体
状态码 |
错误描述 |
200 |
服务器处理成功 |
404 |
无法找到文件 |
500 |
内部服务器错误 |
403 |
服务器拒绝访问 |
301,302 |
请求重定向 |
400 |
无效的请求 |
401 |
未经过授权 |
503 |
服务器超负载或正停机维护,无法处理请求 |
ContentType的作用
- ContentType决定浏览器采用何种方式对响应体进行处理,决定了代码的展现形式
MIME类型 |
描述 |
text/plain |
纯文本 |
text/html |
HTML文档 |
text/xml |
XML文档 |
application/x-msdownload |
需要下载的资源 |
image/jpeg image/gif image/... |
图片资源 |
请求转发与重定向
请求转发
- 服务器会跳转,只会产生一次请求
- request.getRequestDispatcher).forward() -请求转发:不会改变地址栏中的地址
响应重定向
- 浏览器端跳转,会产生两次请求
- response.sendRedirect() -响应重定向:回调转到重定向的地址
设置请求自定义属性
- 请求允许创建自定义属性
- 设置请求属性: request.setAttribute(属性名, 属性值)
- 获取请求属性: Object attr = request.getAttribute(属性名)
浏览前Cookie
- Cookie是浏览器保存在本地的文本内容
- Cookie常用于保存登录状态、用户资料等小文本
- Cookie具有时效性,Cookie内容会伴随请求发送给Tomcat
==================loginServlet=====================
@WebServlet("/cookies/login")
public class loginServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
System.out.println("用户登录成功!");
Cookie cookie = new Cookie("user","admin");
response.addCookie(cookie); //创建Cookie信息
cookie.setMaxAge(60*60*24*7); //设置cookie的保存时间
response.getWriter().println("login success!");
}
}
===================indexServlect=======================
@WebServlet("/cookies/index")
public class indexServlect extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
Cookie[] cookie = request.getCookies();//获取Cookie信息
if(cookie==null) {
response.getWriter().println("user not login");
return;
}
String user=null;
for(Cookie cs : cookie) {
String cd=cs.getName()+":"+cs.getValue();
System.out.println(cd);
response.getWriter().println(cd);
if(cs.getName().equals("user")) {
user=cs.getValue();
}
}
if (user == null) {
response.getWriter().println("user not login");
}else {
response.getWriter().println("user:"+user);
}
}
}
Session-用户会话
- Session (用户会话)用于保存与"浏览器窗口”对应的数据
- Session的数据存储在Tomcat服务器的内存中,具有时效性
- Session通过浏览器Cookie的Sessionld值提取用户数据
与浏览器绑定的且吧内容存储在Tomcat中的对象
===========SessionLoginServlet=============
@WebServlet("/session/login")
public class SessionLoginServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
System.out.println("用户登录成功");
//获取到用户会话Session对象
HttpSession session = request.getSession();
String sessionId = session.getId();
System.out.println(sessionId);
session.setAttribute("name", "admin");
request.getRequestDispatcher("/session/index").forward(request, response);
}
}
============SessionIndexServlet=================
@WebServlet("/session/index")
public class SessionIndexServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession();
String sessionId = session.getId();
System.out.println(sessionId);
String name = (String)session.getAttribute("name");
response.setContentType("text/html;charset=utf-8");
response.getWriter().println("这是首页,当前用户为:"+name);
}
}
Session原理
ServletContext
- ServletContext(Servlet上下文对象),是Web应用全局对象
- 一个Web应用只会创建一个ServletContext对象
- ServletContext随着Web应用启动而自动创建
================ServletContextServlet===================
@WebServlet("/servletcontext/init")
public class ServletContextServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ServletContext context = request.getServletContext();
context.setAttribute("copyright", "afterglow");
context.setAttribute("title", "唐僧洗头艹飘柔");
response.getWriter().println("init success:");
}
}
=================ServletContextDefaultServlet===================
@WebServlet("/servletcontext/default")
public class ServletContextDefaultServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ServletContext servletcontext = (ServletContext)request.getServletContext();
String copyright = (String) servletcontext.getAttribute("copyright");
String title = (String) servletcontext.getAttribute("title");
response.setContentType("text/html;charset=utf-8");
response.getWriter().println("<h1>"+copyright+"</h1>");
response.getWriter().println("<h1>"+title+"</h1>");
}
}
Java Web三大作用域对象
- HttpServletRequest -请求对象:生命周期最短,当一个请求送往tomcat中,这个对象就会存在了,当Servlet处理完成并且产生响应返回给浏览器,当前的请求对象就会被销毁
- HttpSession -用户会话对象:第一次用户发来请求的时候创建,在30分钟后没有访问这个session就会被销毁
- ServletContext - web应用全局对象:Web应用程序启动的时候被创建,在Web应用程序重启或者关闭的时候被销毁
作用域和生命周期依次递增
能用小作用域开发的就不要使用大的作用域开发
Web应用的中文乱码由来
- Tomcat默认使用字符集ISO-8859-1,属于西欧字符集
- 解决乱码的核心思路是将ISO-8859-1转换为UTF-8
- Servlet中请求与响应都需要设置UTF-8字符集
@WebServlet("/charset/process")
public class CharsetServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//对于Tomcat8.x的版本,默认get请求发送中文就是UTF-8的格式,因此无需转换
String ename = request.getParameter("ename");
String address = request.getParameter("address");
response.setContentType("text/html;charset=utf-8");//设置响应的输出字符集
response.getWriter().println(ename+":"+address);
System.out.println(ename+":"+address);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//request.setCharacterEncoding方法用于将请求体重的字符集转为UTF-8
request.setCharacterEncoding("UTF-8");
// TODO Auto-generated method stub
String ename = request.getParameter("ename");
String address = request.getParameter("address");
response.setContentType("text/html;charset=utf-8");//设置响应的输出字符集
response.getWriter().println(ename+":"+address);
System.out.println(ename+":"+address);
}
}
web.xml常用配置
================PatternServlet=====================
public class PatternServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//查询员工基本信息
//获取当前访问的URL
String url = request.getRequestURI().toString();
System.out.println(url);
String id = url.substring(url.lastIndexOf("/")+1);
response.setContentType("text/html;charset=utf-8");
response.getWriter().println(id);
}
}
===================XML=======================
<servlet>
<servlet-name>patternServlet</servlet-name>
<servlet-class>fun.afterglow.servlet.pattern.PatternServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>patternServlet</servlet-name>
<!--这里的url最后需要使用*-->
<url-pattern>/pattern/*</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
//web.xml会依次检查这些页面是否存在,如果有一个存在他就会自动加载
==================XML======================
<context-param>
<param-name>title</param-name>
<param-value>唐僧洗头艹飘柔</param-value>
</context-param>
<context-param>
<param-name>copyright</param-name>
<param-value>afterglow</param-value>
</context-param>
=====================ServletContextServlet=========================
@WebServlet("/servletcontext/init")
public class ServletContextServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ServletContext context = request.getServletContext();
String copyright = context.getInitParameter("copyright");
String title = context.getInitParameter("title");
context.setAttribute("copyright", copyright);
context.setAttribute("title", title);
response.getWriter().println("init success:");
}
}
===============ServletContextDefaultServlet=====================
@WebServlet("/servletcontext/default")
public class ServletContextDefaultServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ServletContext servletcontext = (ServletContext)request.getServletContext();
String copyright = (String) servletcontext.getAttribute("copyright");
String title = (String) servletcontext.getAttribute("title");
response.setContentType("text/html;charset=utf-8");
response.getWriter().println("<h1>"+copyright+"</h1>");
response.getWriter().println("<h1>"+title+"</h1>");
}
}
<!--指定错误页面 location需要指定页面所在位置-->
<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>
JSP九大内置对象
内置对象 |
描述 |
request |
请求对象- HttpServletRequest |
response |
响应对象- HttpServletResponse |
session |
用户会话- HttpSession |
application |
应用全局对象- ServletContext |
out |
输出对象- PrintWriter |
page |
当前页面对象-this |
pageContext |
页面上下文对象- PageContext |
config |
应用配置对象- ServletConfig |
exception |
应用异常对象-Throwable |
<%
String url = request.getRequestURL().toString();// HttpServletRequest
response.getWriter().println(url);//HttpServletPrsponse
%>
共有 0 条评论