服务器介绍
Servlet的概念和特点
Servlet介绍
问题:
服务器在接受到浏览器的请求后,会自动调用对应的逻辑代码进行请求处理。但是逻辑代码是由程序员编写并放到服务器中,那么服务器怎么知道该怎么调用并调用哪个类和哪个方法来进行请求处理。
解决:
程序员在编写代码的时候如果能够按照服务器能够识别的规则进行编写,浏览器按照指定的规则进行发送请求,那么服务器就可以调用并执行相应的逻辑代码进行请求处理了。
实现:
Servlet技术
概念:
狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。Servlet运行于支持Java的应用服务器中。从原理上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。
特点:
运行在支持java的应用服务器上
Servlet的实现遵循了服务器能够识别的规则,也就是服务器会自动的根据请求调用对应的servlet进行请求处理。
简单方便,可移植性强。
使用:
- 创建普通的java类并继承HttpServlet
- 覆写service方法
- 在service方法中书写逻辑代码即可
- 在webRoot下的WEB-INF文件夹下的web.xml文件中配置servlet.
第一个Servlet程序
1.在MyServlet类中覆写service方法
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @Auther:penghao
* @Date:2019/3/21
* @Description:PACKAGE_NAME
* @version:1.0
*/
public class MyServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().write("this is my first servlet.");
System.out.println("this is my first servlet");
}
}
2.在web.xml文件中配置
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<!--
配置servlet
注意:一组servlet配置包括两个组成部分(servlet,servlet-mapping),两个servlet的servlet-name的值必须一致
-->
<servlet>
<servlet-name>my</servlet-name>
<servlet-class>MyServlet</servlet-class> <!--书写servlet的全限定路径(包名+类名)-->
</servlet>
<servlet-mapping>
<servlet-name>my</servlet-name>
<url-pattern>/s</url-pattern> <!--配置servlet的访问别名-->
</servlet-mapping>
</web-app>
3.打开tomcat的安装目录,在webapps目录下新建文件夹,文件夹名为project,并将项目源码全部复制到该文件夹下。
4.启动tomcat服务器,并在地址栏输入:localhost:8080/project/s
Servlet执行流程
Servlet的web.xml配置:
web.xml配置的作用:
保护Servlet.
配置方式一:
精确配置
<url-pattern>/别名</url-pattern>
注意:
"/"是必须声明的,别名不可以为中文
此种配置方式可以配置多个
<servlet>
<servlet-name>my</servlet-name>
<servlet-class>com.java.servlet.mysevlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>my</servlet-name>
<url-pattern>/s</url-pattern>
</servlet-mapping>
配置方式二:
模糊配置
<url-pattern>*.后缀名</url-pattern>
注意:
*表示任意个数的任意字符
所有以指定的后缀名结尾的请求都会调用该servlet进行处理
作用:
进行模块化开发的划分等
<servlet>
<servlet-name>my</servlet-name>
<servlet-class>com.java.servlet.mysevlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>my</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
配置方式三:
拦截所有请求
<url-pattern>/*</url-pattern>
注意:
会拦截所有类型的请求,包括静态资源请求(css、js、图片等)和jsp请求。
配置方式四
<url-pattern>/one/*</url-pattern>
注意:
会拦截处理所有Servlet的别名以one开头的路径的请求
<servlet>
<servlet-name>my</servlet-name>
<servlet-class>com.java.servlet.mysevlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>my</servlet-name>
<url-pattern>/one/*</url-pattern>
</servlet-mapping>
加载时机:
服务器启动的时候会将部署好的项目统一进行加载,并完成对每个项目的web.xml文件的加载
注意
一个Servlet可以拥有多个url-pattern配置,但是一个url-pattern配置只能对应一个Servlet.
服务器之单例创建Servlet
Servlet的生命周期:
结论:
从第一次被调用到服务器关闭
验证:
init方法:servlet被初始化创建的时候调用
service方法:处理请求的时候
destory方法:servlet被销毁的时候。
当服务器关闭的时候销毁servlet,触发destroy方法的执行
注意:
我们可以在web.xml中配置load-on-startup来设置Servlet的加载时机为服务器启动。
生命周期就变为从服务器开启到服务器关闭。
package com.java.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @Auther:penghao
* @Date:2019/3/21
* @Description:${PACKAGE_NAME}
* @version:1.0
*/
@WebServlet(name = "Servlet")
public class Servlet extends HttpServlet {
@Override
public void init() throws ServletException {
System.out.println("我被初始化了");
}
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("我被执行了");
}
@Override
public void destroy() {
System.out.println("我被销毁了");
}
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<servlet>
<servlet-name>se</servlet-name>
<servlet-class>com.java.servlet.Servlet</servlet-class>
<load-on-startup>1</load-on-startup> <!--配置servlet服务器启动时完成加载和初始化创建-->
</servlet>
<servlet-mapping>
<servlet-name>se</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
doGet、doPost和Service方法的区别
doGet
处理get方式的请求
doPost
处理post方式的请求
service
无论是什么类型的请求方式,服务器都会优先执行service方法。
注意
servlet中没有声明service方法,会根据请求方式调用对应的方法进行请求处理,如果在servlet中没有声明对应的请求处理方法,则会报405错误。
tomcat服务器其实只认识service方法,如果我们自己声明的servlet中没有覆写service方法,则会执行HttpServlet中的sercice方法,而该方法会根据请求方法调用对应的doXX()方法执行请求处理
package com.java.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @Auther:penghao
* @Date:2019/3/21
* @Description:${PACKAGE_NAME}
* @version:1.0
*/
@WebServlet(name = "Servlet")
public class Servlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("我是post方式的请求");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("我是get方式的请求");
}
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("我是service请求方式");
}
}
<%--
Created by IntelliJ IDEA.
User: PengHao
Date: 2019/3/21
Time: 16:00
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>My JSP 'login.jsp' strating page</title>
</head>
<body>
<form action="user" method="post">
用户名:<input type="text" name="uname" value=""/><br/>
密码:<input type="password" name="pwd" value=""/><br/>
<input type="submit" value="登录"/>
</form>
</body>
</html>
Servlet的常见错误总结:
Servlet的常见错误:
404错误:资源未找到
原因一:在请求地址中的servlet的别名书写错误。
原因二:虚拟项目名称拼写错误
500错误:内部服务器错误
错误一:java.lang.ClassNotFoundException
解决:在web.xml中校验servlet类的全限定路径是否拼写错误。
错误二:因为service方法体的代码执行错误导致。
解决:根据错误提示对service方法体中的代码进行错误更改
405错误:请求方式不支持
原因:请求方式和servlet中的方法不匹配所造成的。
解决:尽量使用service方法进行请求处理,并且不要在service方法中调用父类的service.
HTTPServletRequest的介绍和特点
request对象学习之获取请求数据
package com.java.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Enumeration;
/**
* @Auther:penghao
* @Date:2019/3/21
* @Description:${PACKAGE_NAME}
* @version:1.0
*/
/**
* request对象学习之获取请求数据
* 请求数据:
* 请求行:请求方式 请求URL 协议
* getMethod(); 返回请求方式
* getRequestUrl(); 返回请求url
* getRequestUri(); 返回请求uri
* getQueryString(); 返回get请求中的URL中的用户数据 注意:post请求中没有此方法
* getSchema(); 返回协议
* 请求头
* getHeader(String name) 根据键名获取请求头信息
* 注意:如果获取的请求头信息不存在返回null.
* getHeaderNames() 返回存储了请求头键名的枚举集合
* 请求实体
* getParameter(String name) 根据键名获取数据
* 注意:
* 键名其实就是前端页面中的表单标签的name属性的值或者前端页面其他方式提交数据的键的名字
* 如果请求中没有对应的请求数据,则返回null.
* getParameterValues(String name) 根据键名获取同名不同的值,返回数组
* 注意:如果没有对应的键名,则返回null
* getParameterNames() 返回实体数据中键名的枚举
* 请求网络相关的数据
* getRemoteAddr() 获取客户端的IP地址
* getRemotePort() 获取客户端端口号
* getLocalAddr() 获取服务器端的ip
* getLocalPort() 获取服务器端的端口
*/
public class RequestServlet extends HttpServlet {
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取请求信息
//获取请求行信息
//获取请求方式
String method = req.getMethod();
System.out.println("请求方式:"+method);
//获取请求URL信息
StringBuffer requestURL = req.getRequestURL();
System.out.println("请求URL"+requestURL);
//获取请求URI信息
String requestURI = req.getRequestURI();
System.out.println("请求URI"+requestURI);
//获取get请求URL中的请求数据
String queryString = req.getQueryString();
System.out.println("获取get请求URL中的数据"+queryString);
//获取协议
String scheme = req.getScheme();
System.out.println("获取请求协议"+scheme);
//获取请求头信息
//根据键名获取请求头信息
String header = req.getHeader("User-Agent");
System.out.println("获取浏览器版本信息:"+header);
//获取请求头中键名的枚举
Enumeration<String> headerNames = req.getHeaderNames();
while (headerNames.hasMoreElements()){
//获取请求头键名
String name = (String) headerNames.nextElement();
//获取请求头的键名对应的值
String value = req.getHeader(name);
System.out.println(name+":"+value);
}
//获取请求实体数据(用户数据)
//根据键名获取数据
String uname = req.getParameter("uname");
String pwd = req.getParameter("pwd");
System.out.println("请求实体数据"+uname+":"+pwd);
//获取同名不同值的实体数据
String[] favs = req.getParameterValues("fav");
if (favs!=null){
for(String s:favs){
System.out.println("fav的值为:"+s);
}
}
//获取请求实体中键名的枚举
Enumeration<String> names = req.getParameterNames();
while (names.hasMoreElements()) {
//获取键名
String name = (String) names.nextElement();
//判断
if ("fav".equals(name)) {
String[] fav2 = req.getParameterValues(name);
for (String s : fav2) {
System.out.println(name + ":" + s);
}
} else {
String value = req.getParameter(name);
System.out.println(name + ":" + value);
}
}
//请求相关的网络数据
//获取客户端信息
String remoteAddr = req.getRemoteAddr();
System.out.println("获取客户端的IP"+remoteAddr);
//获取客户端的端口号(浏览器)
int remotePort = req.getRemotePort();
System.out.println("获取客户端的端口号:"+remotePort);
//获取服务器的主机ip
String localAddr = req.getLocalAddr();
System.out.println("获取服务器ip:"+localAddr);
//获取服务器的端口号
int localPort = req.getLocalPort();
System.out.println("获取服务器的端口号:"+localPort);
}
}
resp对象之处理响应学习
package com.java.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @Auther:penghao
* @Date:2019/3/22
* @Description:${PACKAGE_NAME}
* @version:1.0
*/
/**
* resp对象之处理响应学习
* 设置响应行:协议 状态码 状态消息
* resp.sendError(int status);
* 作用:可以自主的响应状态给浏览器
* 设置响应头:
* addHeader(String name,String value) 添加响应头信息,同名数据不会覆盖
* setHeader(String name,String value) 设置响应头信息,会覆盖原有信息。如果没有此响应头则添加该信息
* 设置响应实体(处理结果):
* resp.getWriter().write("实体内容")
* 注意:
* 实体内容可以分开进行响应。
* 注意:
* 一旦使用resp对象作出了请求响应,则意味着此次请求处理完毕。服务器在响应后会将此次请求相关的req对象和resp对象销毁。
*/
@WebServlet(name = "ResponseServlet")
public class ResponseServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取请求数据
//处理请求数据
//响应处理结果
//设置响应行
//自定义响应404异常
//resp.sendError(404);
//设置响应头
//添加响应头信息
resp.addHeader("mouse","thinkpad");
resp.addHeader("mouse","thinkpad2");
//设置响应头
resp.setHeader("mouse","two fly birds");
//设置响应实体
resp.getWriter().write("resp object");
resp.getWriter().write("resp object");
}
}
乱码问题解决
package com.java.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @Auther:penghao
* @Date:2019/3/22
* @Description:${PACKAGE_NAME}
* @version:1.0
*/
/**
* 请求乱码问题:服务器获取的请求数据乱码
* post请求方式乱码:
* req.setCharacterEncoding("utf-8");
* get请求方式乱码解决:
* 方式一:每个数据都要单独的进行转换
* String uname = req.getParameter("uname");
* String uname2 = new String(uname.getBytes("iso-8859-1"),"utf-8");
* 方式二:
* req.setCharacterEncoding("utf-8");
* 在romcat的server.xml文件中的Connector标签中增加属性:useBodyEncodingForURI="true"
*
* 响应乱码问题:浏览器中显示的服务器响应数据乱码
* resp.setContentType("text/html;charset=utf-8");
* service代码编写流程:
* 设置请求编码格式
* 设置响应编码格式
* 获取请求信息
* 处理请求信息
* 响应请求信息
*/
@WebServlet(name = "CodeServlet")
public class CodeServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置请求编码格式
req.setCharacterEncoding("utf-8");
//设置响应编码格式
resp.setHeader("content-type","text/html;charset=utf-8");
//resp.setContentType("text/html;charset=utf-8");
//获取请求数据
String uname = req.getParameter("uname");
//String uname2 = new String(uname.getBytes("iso-8859-1"),"utf-8");
//处理请求数据
System.out.println(uname);
//响应处理结果
resp.getWriter().write("请求处理完毕.");
}
}
简单的登录练习
package com.java.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @Auther:penghao
* @Date:2019/3/22
* @Description:${PACKAGE_NAME}
* @version:1.0
*/
@WebServlet(name = "LoginServlet")
public class LoginServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置请求编码格式
req.setCharacterEncoding("utf-8");
//设置响应编码格式
resp.setContentType("text/html;charset=utf-8");
//获取请求信息
//处理请求信息
//响应处理结果
resp.getWriter().write("<html>");
resp.getWriter().write("<head>");
resp.getWriter().write("</head>");
resp.getWriter().write("<body>");
resp.getWriter().write("<form action='user' method='post'>");
resp.getWriter().write("用户名:<input type='text' name='uname' value=''/><br />");
resp.getWriter().write("密码:<input type='password' name='pwd' value=''/><br />");
resp.getWriter().write("<input type='submit' value='登录'/>");
resp.getWriter().write("</form>");
resp.getWriter().write("</body>");
resp.getWriter().write("</html>");
}
}
package com.java.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @Auther:penghao
* @Date:2019/3/22
* @Description:${PACKAGE_NAME}
* @version:1.0
*/
@WebServlet(name = "UserServlet")
public class UserServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置请求编码格式
req.setCharacterEncoding("utf-8");
//设置响应编码格式
resp.setContentType("text/html;charset=utf-8");
//获取请求信息
String uname = req.getParameter("uname");
String pwd = req.getParameter("pwd");
//处理请求信息
if("张三".equals(uname)&&"123".equals(pwd)){
resp.getWriter().write("登录成功");//响应处理结果
}else{
resp.getWriter().write("用户名或密码错误");//响应处理结果
}
}
}
请求转发
package com.java.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet(
name = "LoginServlet"
)
public class LoginServlet extends HttpServlet {
public LoginServlet() {
}
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
String str = req.getAttribute("str") == null ? "" : (String)req.getAttribute("str");
resp.getWriter().write("<html>");
resp.getWriter().write("<head>");
resp.getWriter().write("</head>");
resp.getWriter().write("<body>");
resp.getWriter().write("<form action='user' method='post'>");
resp.getWriter().write("<font color='red'>" + str + "</font>");
resp.getWriter().write("<br/>");
resp.getWriter().write("用户名:<input type='text' name='uname' value=''/><br />");
resp.getWriter().write("密码:<input type='password' name='pwd' value=''/><br />");
resp.getWriter().write("<input type='submit' value='登录'/>");
resp.getWriter().write("</form>");
resp.getWriter().write("</body>");
resp.getWriter().write("</html>");
}
}
package com.java.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet(
name = "UserServlet"
)
public class UserServlet extends HttpServlet {
public UserServlet() {
}
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
String uname = req.getParameter("uname");
String pwd = req.getParameter("pwd");
if ("张三".equals(uname) && "123".equals(pwd)) {
resp.getWriter().write("登录成功");
} else {
resp.getWriter().write("用户名或密码错误");
req.setAttribute("str", "用户名或密码错误");
req.getRequestDispatcher("login").forward(req, resp);
}
}
}
重定向
package com.java.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @Auther:penghao
* @Date:2019/3/22
* @Description:${PACKAGE_NAME}
* @version:1.0
*/
@WebServlet(name = "UserServlet")
public class UserServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置请求编码格式
req.setCharacterEncoding("utf-8");
//设置响应编码格式
resp.setContentType("text/html;charset=utf-8");
//获取请求信息
String uname = req.getParameter("uname");
String pwd = req.getParameter("pwd");
//处理请求信息
if("张三".equals(uname)&&"123".equals(pwd)){
resp.getWriter().write("登录成功");//响应处理结果
}else{
//resp.getWriter().write("用户名或密码错误");//响应处理结果
//请求转发的使用
//将数据存储到req对象中
//req.setAttribute("str","用户名或密码错误");
//请求转发
//req.getRequestDispatcher("login").forward(req,resp);
//重定向
resp.sendRedirect("login");
return;
}
}
}
cookie的作用和特点
cookie的代码实现
package com.java.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @Auther:penghao
* @Date:2019/3/25
* @Description:${PACKAGE_NAME}
* @version:1.0
*/
@WebServlet(name = "MyServlet1")
public class MyServlet1 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置请求编码格式
req.setCharacterEncoding("utf-8");
//设置响应编码格式
resp.setContentType("text/html;charset=utf-8");
//获取请求信息
String a = req.getParameter("a");
String b = req.getParameter("b");
//处理请求信息
System.out.println(a + ":" +b);
//响应处理结果
//创建Cookie数据
Cookie b1 = new Cookie("b", b);
//响应Cookie数据
resp.addCookie(b1);
//直接响应
resp.getWriter().write("我是MyServlet1,处理完毕");
//请求转发
//重定向
}
}
package com.java.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @Auther:penghao
* @Date:2019/3/25
* @Description:${PACKAGE_NAME}
* @version:1.0
*/
@WebServlet(name = "MyServlet2")
public class MyServlet2 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置请求编码格式
req.setCharacterEncoding("utf-8");
//设置响应编码格式
resp.setContentType("text/html;charset=utf-8");
//获取请求信息
//String b = req.getParameter("b");
String bc = null;
//获取Cookie数据
Cookie[] cookies = req.getCookies();
for(Cookie ck:cookies){
if("b".equals(ck.getName())){
bc = ck.getValue();
}
}
String c = req.getParameter("c");
//处理请求信息
System.out.println(bc + ":" +c);
//响应处理结果
//直接响应
resp.getWriter().write("我是MyServlet2,处理完毕");
//请求转发
//重定向
}
}
设置Cookie信息
package com.java.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @Auther:penghao
* @Date:2019/3/25
* @Description:${PACKAGE_NAME}
* @version:1.0
*/
@WebServlet(name = "MyServlet1")
public class MyServlet1 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置请求编码格式
req.setCharacterEncoding("utf-8");
//设置响应编码格式
resp.setContentType("text/html;charset=utf-8");
//获取请求信息
String a = req.getParameter("a");
String b = req.getParameter("b");
//处理请求信息
System.out.println(a + ":" +b);
//响应处理结果
//创建Cookie数据
Cookie b1 = new Cookie("b", b);
//设置Cookie信息
b1.setMaxAge(3600*24*3);//设置Cookie的有效期
//设置有效路径
b1.setPath("/my2");
//响应Cookie数据
resp.addCookie(b1);
//直接响应
resp.getWriter().write("我是MyServlet1,处理完毕");
//请求转发
//重定向
}
}
session的介绍和基本使用流程
package com.java.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
/**
* @Auther:penghao
* @Date:2019/3/25
* @Description:${PACKAGE_NAME}
* @version:1.0
*/
/**
* session学习:
* 问题:
* 用户不同的请求在处理的时候需要使用其他请求中的数据该怎么办?
* 解决:
* session技术
* 使用:
* 创建session对象
* HttpSession session = req.getSession();
* 存储数据到session中
* session.setAttribute(String name,Object value);
* 获取session对象
* HttpSession session = req.getSession();
* 获取session中的数据
* session.getAttribute(String uname);注意:返回的object类型,需要强制转换
* 删除session中的数据
* session.removeAttribute(String uname);注意:如果有数据则删除,没有则什么都不做
* 流程:
* 1、浏览器发起请求到ServletA,在ServletA中使用req.getSession()获取Session对象,如果此次请求中没有
* SessionID则创建一个新的Session对象,如果有Session则将其对应到的Session对象返回(前提是该session对象没有到期)
* 对象到期销毁了,就算有sessionID也会重新创建一个Session。
* 2、检验session是否失效,存储数据到session对象中或者获取session中的数据或者删除session中的数据
* 特点:
* session解决了同一个用户不同请求的数据共享问题。
* session的作用域:浏览器不关闭,session不失效,则同一用户的任意请求获取的都是同一个session
* 一次会话
* session的设置:
* session默认有效时间为30分钟,可以在tomcat下的web.xml中进行配置
* 注意:此种配置方式是所有的tomcat下的项目默认为30分钟
* 也可以在代码中使用
* session.setMaxInactiveInterval(int seconds);//设置session的有效时间,参数为整数类型的秒
* session.invalidate();//强制销毁session
*/
@WebServlet(name = "ServletA")
public class ServletA extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置请求编码格式
req.setCharacterEncoding("utf-8");
//设置响应编码格式
resp.setContentType("text/html;charset=utf-8");
//获取请求信息
String uname = req.getParameter("uname");
//处理请求数据
System.out.println("ServletA.service():"+uname);
//创建Session对象
HttpSession session = req.getSession();
//设置session有效期
//session.setMaxInactiveInterval(5);
//存储数据到session对象中
session.setAttribute("uname",uname);
//强制销毁session
//session.invalidate();
System.out.println("ServletA.service():"+session.getId());
//响应处理结果
//重定向
resp.sendRedirect("b");
}
}
package com.java.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
/**
* @Auther:penghao
* @Date:2019/3/25
* @Description:${PACKAGE_NAME}
* @version:1.0
*/
@WebServlet(name = "ServletB")
public class ServletB extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置请求编码格式
req.setCharacterEncoding("utf-8");
//设置响应编码格式
resp.setContentType("text/html;charset=utf-8");
//获取请求信息
//获取Session对象
HttpSession session = req.getSession();
//获取A的处理结果数据
String uname = (String) session.getAttribute("uname");
//处理请求数据
//打印A流转的数据
System.out.println("ServletB.service():" + uname);
}
}
session之优化登录案例
package com.java.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
/**
* @Auther:penghao
* @Date:2019/3/25
* @Description:${PACKAGE_NAME}
* @version:1.0
*/
@WebServlet(name = "LoginServlet")
public class LoginServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置请求编码格式
req.setCharacterEncoding("utf-8");
//设置响应编码格式
resp.setContentType("text/html;charset=utf-8");
//获取session中的数据
HttpSession session = req.getSession();
String str = (session.getAttribute("flag")==null?"":"用户名或密码错误");
//销毁session
session.invalidate();
//获取请求信息
//处理请求信息
//响应处理结果
//直接响应
resp.getWriter().write("<html>");
resp.getWriter().write("<head>");
resp.getWriter().write("</head>");
resp.getWriter().write("<body>");
resp.getWriter().write("<form action='user' method='get'>");
resp.getWriter().write("<font color='red'>"+str+"</font><br/>");
resp.getWriter().write("用户名:<input type='text' name='uname' value=''/><br/>");
resp.getWriter().write("密码:<input type='password' name='pwd' value=''/><br/>");
resp.getWriter().write("<input type='submit' value='登录'/>");
resp.getWriter().write("</form>");
resp.getWriter().write("</body>");
resp.getWriter().write("</html>");
}
}
package com.java.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
/**
* @Auther:penghao
* @Date:2019/3/25
* @Description:${PACKAGE_NAME}
* @version:1.0
*/
@WebServlet(name = "UserServlet")
public class UserServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置请求编码格式
req.setCharacterEncoding("utf-8");
//设置响应编码格式
resp.setContentType("text/html;charset=utf-8");
//获取请求信息
String uname = req.getParameter("uname");
String pwd = req.getParameter("pwd");
//处理请求信息
//校验用户信息
if("张三".equals(uname)&&"123".equals(pwd)) {
//登录成功
//响应处理结果
}else{
//登录失败
//创建session并增加登录失败标记
HttpSession session = req.getSession();
session.setAttribute("flag","loginFalse");
//响应处理结果(重定向到登录页面)
resp.sendRedirect("login");
}
}
}
ServletContext对象
<!--配置全局配置属性-->
<context-param>
<param-name>flag</param-name>
<param-value>false</param-value>
</context-param>
package com.java.servlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
/**
* @Auther:penghao
* @Date:2019/3/25
* @Description:${PACKAGE_NAME}
* @version:1.0
*/
/**
* ServletContext对象:
* 作用:
* 解决了不同用户之间的数据共享问题
* 使用:
* 创建ServletContext对象
* ServletContext sc1 = this.getServletContext();
* ServletContext sc2 = this.getServletConfig().getServletContext();
* ServletContext sc3 = req.getSession().getServletContext();
* 存储用户共享数据
* sc1.setAttribute(String name,Object value);
* 获取用户共享数据
* sc.getAttribute(String name);
* 删除共享数据
* sc.removeAttribute(String name);
* 获取web.xml中的全局配置属性,作用:将部分动作和源文件进行解耦,我们只需要在xml配置文件中进行相关配置就会改变代码的执行效果。
* sc1.getInitParameter(String name);注意返回的是String类型数据
* 获取web下的资源流对象
* sc1.getResourceAsStream(String path);
* 注意:
* path为相对路径,写从web开始查找资源的路径即可。
* 获取web下的资源绝对路径
* sc1.getRealPath(String path);
* 注意:
* path为相对路径,写从web开始查找资源的路径即可。
* 特点:
* 服务器创建
* 所有用户共享
* 生命周期:
* 服务器开启到服务器关闭
*/
@WebServlet(name = "TestServletContextA")
public class TestServletContextA extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置请求编码格式
req.setCharacterEncoding("utf-8");
//设置响应编码格式
resp.setContentType("text/html;charset=utf-8");
//获取请求信息
//处理请求信息
String str = "我是用户共享数据";
//获取ServletContext对象
ServletContext sc1 = this.getServletContext();
ServletContext sc2 = this.getServletConfig().getServletContext();
ServletContext sc3 = req.getSession().getServletContext();
System.out.println(sc1==sc2);
System.out.println(sc2==sc3);
//存储用户共享数据到ServletContext中
sc1.setAttribute("str",str);
//获取web.xml中的全局配置属性
String f = sc1.getInitParameter("flag");
if("false".equals(f)){
System.out.println("TestServletContextA.service(关闭***资源)");
}else{
System.out.println("TestServletContextA.service(打开***资源)");
}
//获取web下资源的流对象
InputStream resourceAsStream = sc1.getResourceAsStream("image/p.jpg");
//获取web下资源的绝对路径
String path = sc1.getRealPath("image/p.jpg");
System.out.println(path);
//响应处理结结果
//直接响应
resp.getWriter().write("数据已经在ServletContext中存储完毕");
//请求转发
//重定向
}
}
package com.java.servlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @Auther:penghao
* @Date:2019/3/25
* @Description:${PACKAGE_NAME}
* @version:1.0
*/
@WebServlet(name = "TestServletContextB")
public class TestServletContextB extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置请求编码格式
req.setCharacterEncoding("utf-8");
//设置响应编码格式
resp.setContentType("text/html;charset=utf-8");
//获取请求信息
//获取ServletContext对象
ServletContext sc = this.getServletContext();
//获取共享数据
String str =(String) sc.getAttribute("str");
//处理请求信息
System.out.println("TestServletContextB.service()"+str);
//响应处理结果
//直接响应
//请求转发
//重定向
}
}
ServletContext对象实现网页访问次数
package com.java.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
/**
* @Auther:penghao
* @Date:2019/3/25
* @Description:${PACKAGE_NAME}
* @version:1.0
*/
@WebServlet(name = "LoginServlet")
public class LoginServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置请求编码格式
req.setCharacterEncoding("utf-8");
//设置响应编码格式
resp.setContentType("text/html;charset=utf-8");
//获取session中的数据
HttpSession session = req.getSession();
String str = (session.getAttribute("flag")==null?"":"用户名或密码错误");
//销毁session
session.invalidate();
//获取请求信息
//处理请求信息
//响应处理结果
//直接响应
resp.getWriter().write("<html>");
resp.getWriter().write("<head>");
resp.getWriter().write("</head>");
resp.getWriter().write("<body>");
resp.getWriter().write("<form action='user' method='get'>");
resp.getWriter().write("<font color='red'>"+str+"</font><br/>");
resp.getWriter().write("用户名:<input type='text' name='uname' value=''/><br/>");
resp.getWriter().write("密码:<input type='password' name='pwd' value=''/><br/>");
resp.getWriter().write("<input type='submit' value='登录'/>");
resp.getWriter().write("</form>");
resp.getWriter().write("</body>");
resp.getWriter().write("</html>");
}
}
package com.java.servlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
/**
* @Auther:penghao
* @Date:2019/3/25
* @Description:${PACKAGE_NAME}
* @version:1.0
*/
@WebServlet(name = "UserServlet")
public class UserServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置请求编码格式
req.setCharacterEncoding("utf-8");
//设置响应编码格式
resp.setContentType("text/html;charset=utf-8");
//获取请求信息
String uname = req.getParameter("uname");
String pwd = req.getParameter("pwd");
//处理请求信息
//校验用户信息
if("张三".equals(uname)&&"123".equals(pwd)) {
//登录成功
//获取ServletContext对象
ServletContext sc = this.getServletContext();
//获取计数器
Object obj = sc.getAttribute("nums");
//判断
if(obj!=null){
//计数器数据自增
int nums=(int)obj;
nums=nums+1;
//存储计数器数据到ServletContext对象
sc.setAttribute("nums",nums);
}else{
sc.setAttribute("nums",1);
}
//创建session对象
HttpSession hs = req.getSession();
//存储数据
hs.setAttribute("uname",uname);
//响应处理结果(重定向到登录成功的Servlet)
resp.sendRedirect("main");
}else{
//登录失败
//创建session并增加登录失败标记
HttpSession session = req.getSession();
session.setAttribute("flag","loginFalse");
//响应处理结果(重定向到登录页面)
resp.sendRedirect("login");
}
}
}
package com.java.servlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @Auther:penghao
* @Date:2019/3/25
* @Description:${PACKAGE_NAME}
* @version:1.0
*/
@WebServlet(name = "MainServlet")
public class MainServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置请求编码格式
req.setCharacterEncoding("utf-8");
//设置响应编码格式
resp.setContentType("text/html;charset=utf-8");
//获取请求信息
//获取ServletContext对象
ServletContext sc = this.getServletContext();
//获取计数器数据
int nums=(int)sc.getAttribute("nums");
//处理请求信息
//响应处理结果
//直接响应
resp.getWriter().write("<html>");
resp.getWriter().write("<head>");
resp.getWriter().write("</head>");
resp.getWriter().write("<body>");
resp.getWriter().write("<h3>欢迎"+req.getSession().getAttribute("uname")+"访问主页</h3>");
resp.getWriter().write("<hr/>");
resp.getWriter().write("当前网页浏览次数为:"+nums);
resp.getWriter().write("</body>");
resp.getWriter().write("</html>");
}
}
package com.java.servlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
/**
* @Auther:penghao
* @Date:2019/3/25
* @Description:${PACKAGE_NAME}
* @version:1.0
*/
@WebServlet(name = "NumServlet")
public class NumServlet extends HttpServlet {
//在服务器启动的时候将nums.txt中的数据存储到ServletContext中
@Override
public void init() throws ServletException {
//获取ServletContext对象
ServletContext sc = this.getServletContext();
//获取nums.txt中存储的浏览器次数
//获取nums.txt的绝对路径(动态获取)
String path = sc.getRealPath("num/nums.txt");
//创建File对象
File f = new File(path);
//读取nums.txt中的数据
//获取资源流对象
BufferedReader br = null;
InputStreamReader is = null;
FileInputStream fs = null;
try {
fs = new FileInputStream(f);
is = new InputStreamReader(fs);
br = new BufferedReader(is);
//读取
String nums = br.readLine();
//将数据存储到ServletContext中
sc.setAttribute("nums",Integer.parseInt(nums));
}catch (Exception e){
e.printStackTrace();
}finally {
//关闭资源流
try {
fs.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
//在服务器关闭的时候将ServletContext中的计数器数据存储到nums.txt中
@Override
public void destroy() {
//获取ServletContext对象
ServletContext sc = this.getServletContext();
//获取计数器数据
int nums =(int) sc.getAttribute("nums");
//将计数器数据存储到nums.txt文件中
//获取nums.txt文件的绝对路径(动态获取)
String path = sc.getRealPath("num/nums.txt");
//获取nums.txt的File对象
File f = new File(path);
//获取资源的流对象
BufferedWriter bw = null;
OutputStreamWriter ow = null;
FileOutputStream fs = null;
try {
//获取nums.txt的流对象
fs = new FileOutputStream(f);
ow = new OutputStreamWriter(fs);
bw = new BufferedWriter(ow);
//将数据写入到nums.txt中
bw.write(nums+"");
//刷新
bw.flush();
}catch (Exception e){
e.printStackTrace();
}finally {
//关闭流资源
try {
fs.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
ow.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<servlet>
<servlet-name>login</servlet-name>
<servlet-class>com.java.servlet.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>login</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>user</servlet-name>
<servlet-class>com.java.servlet.UserServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>user</servlet-name>
<url-pattern>/user</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>main</servlet-name>
<servlet-class>com.java.servlet.MainServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>main</servlet-name>
<url-pattern>/main</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>NumServlet</servlet-name>
<servlet-class>com.java.servlet.NumServlet</servlet-class>
<load-on-startup>1</load-on-startup> <!--配置Servlet服务器启动加载-->
</servlet>
</web-app>
ServletConfig对象学习
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<servlet>
<servlet-name>TestServletConfig</servlet-name>
<servlet-class>com.java.servlet.TestServletConfig</servlet-class>
<!--配置当前Servlet的属性信息-->
<init-param>
<param-name>flag</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>code</param-name>
<param-value>utf-8</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>TestServletConfig</servlet-name>
<url-pattern>/tg</url-pattern>
</servlet-mapping>
</web-app>
package com.java.servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @Auther:penghao
* @Date:2019/3/27
* @Description:${PACKAGE_NAME}
* @version:1.0
*/
@WebServlet(name = "TestServletConfig")
public class TestServletConfig extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取ServletConfig对象
ServletConfig sg = this.getServletConfig();
//设置请求编码格式
req.setCharacterEncoding(sg.getInitParameter("code"));
//设置响应编码格式
resp.setContentType("text/html;charset=utf-8");
//获取请求信息
//获取web.xml中的属性配置
String flag = sg.getInitParameter("flag");
System.out.println(flag);
//获取用户请求信息
String uname = req.getParameter("uname");
//处理请求信息
System.out.println(uname);
//处理请求信息
//响应处理结果
}
}