目录
Servlet
Servlet是在服务器端运行的Java程序,可以接收客户端请求并做出响应
Servlet体系结构
1.接口
Servlet、ServletConfig
2.抽象类
GenericServlet、HttpServlet
Servlet接口
定义了所有Servlet需要实现的方法
方法名称 | 功能描述 |
void init (ServletConfig config) | 由 Servlet 容器调用,用于完成Servlet对象在处理客户请求 前的初始化工作 |
void service (ServletRequest req,ServletResponse res) | 由 Servlet 容器调用,用来处理客户端的请求 |
void destroy ( ) | 由 Servlet 容器调用,释放Servlet对象所使用的资源 |
ServletConfig getServletConfig ( ) | 返回ServletConfig 对象,该对象包含此 Servlet 的初始化和启动参数。返回的ServletConfig 对象是传递给 init( ) 方法的对象 |
String getServletInfo ( ) | 返回有关 Servlet 的信息,比如作者、版本和版权。返回的字符串是纯文本,而不是任何种类的标记(如 HTML、XML等) |
ServletConfig接口
方法名称
|
功能描述
|
String
getInitParameter (String name )
|
获取web.xml中设置的以name命名的初始化参数值
|
ServletContext getServletContext( )
|
返回Servlet的上下文对象引用
|
ServletContext接口
方法名称
|
功能描述
|
String
getInitParameter (String name )
|
获取名为name的系统范围的
初始化参数值,系统范围的初始化参数可在部署描述符中使用<context-param>元素定义
|
void
setAttribute (String name, Object object )
|
设置名称为name的属性
|
Object
getAttribute (String name )
|
获取名称为name的属性
|
String
getRealPath (String path )
|
返回参数所代表目录的真实路径(例:查根目录路径传的参为“/”)
|
void
log ( String message )
|
记录一般
日志信息
|
GenericServlet抽象类
提供了Servlet与ServletConfig接口方法的默认实现(service( )方法除外)
方法名称 | 功能描述 |
public void init (ServletConfig config ) | 对Servlet接口中init()方法的实现,对ServletConfig实例进行了保存。此方法还有一个无参的重载方法,可用于子类中重写 |
public String getInitParameter (String name ) | 返回web.xml中名称为name的初始化参数的值 |
public ServletContext getServletContext ( ) | 返回ServletContext对象的引用 |
HttpServlet抽象类
继承自GenericServlet
处理HTTP协议的请求和响应
方法名称 | 功能描述 |
public void service ( ServletRequest req, ServletResponse res ) | 对GenericServlet类中service()方法的实现,将请求分 发给protected void service (HttpServletRequest req,HttpServletResponse res ) |
protected void service ( HttpServletRequest req, HttpServletResponse res ) | 接收HTTP 请求,并将它们分发给此类中定义的doXXX( ) 方法 |
protected void doXXX ( HttpServletRequest req, HttpServletResponse res ) | 根据请求方式的不同分别调用的相应处理方法,如 doGet()、doPost()等 |
例:
@WebServlet("/page1")
public class Demo02 extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//处理乱码
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
// 设置响应格式
response.setContentType("text/html;charset=utf-8");
// 设置变量
String name = "张三";
// 获取servlet容器对象
ServletContext sc = getServletContext();
// 设置名称为name的属性
sc.setAttribute("username", name);
// 获取打印流对象
PrintWriter out = response.getWriter();
out.print("<h1>"+name+"</h1>");
// 释放资源
out.close();
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
@WebServlet("/page2")
public class Demo03 extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//处理乱码
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
// 设置响应格式
response.setContentType("text/html;charset=utf-8");
// 获取servlet容器对象
ServletContext sc = getServletContext();
// 获取名称为username的属性
Object attribute = sc.getAttribute("username");
// 获取打印流对象
PrintWriter out = response.getWriter();
out.print("<h1>页面2"+attribute+"</h1>");
// 释放资源
out.close();
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
ServletRequest接口
获取客户端请求的数据
方法名称 | 功能描述 |
Object getAttribute ( String name ) | 获取名称为name的属性值 |
void setAttribute (String name, Object object ) | 在请求中保存名称为name的属性 |
void removeAttribute (String name) | 清除请求中名字为name的属性 |
String getCharacterEncoding ( ) | 返回请求体所使用的字符编码 |
void setCharacterEncoding (String charset ) | 设置请求体的字符编码 |
String getParameter ( String name ) | 返回指定请求参数的值 |
String[ ] getParameterValues (String name ) | 返回指定请求参数的全部值 |
RequestDispatcher getRequestDispatcher( String path ) | 返回指向指定路径的请求分发对象 |
例:
@WebServlet("/addlogin.do")
public class AddLoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 处理乱码
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
// 获取对象
SqlSession sqlSession = DaoUtil.getSqlSession();
PrintWriter out = response.getWriter();
// 获取数据
// 返回指定请求参数的值
String username = request.getParameter("username");
String userpwd = request.getParameter("userpwd");
String reuserpwd = request.getParameter("reuserpwd");
// 获取请求中名称为sex的属性
String sex = request.getParameter("sex");
// 判断两次密码是否一致
if(userpwd.equals(reuserpwd)) {
// 获取Login对象并给其对象添加信息
Login lo = new Login();
lo.setLname(username);
lo.setLpwd(userpwd);
lo.setLsex(sex);
LoginMapper loMapper = sqlSession.getMapper(LoginMapper.class);
int ret = loMapper.addLogin(lo);
if(ret > 0) {
sqlSession.commit();
out.print("<script>\r\n" +
" alert(\"恭喜你\");\r\n" +
" location.href=\"login.do\";\r\n" +
"</script>");
}else {
sqlSession.rollback();
out.print("<script>\r\n" +
" alert(\"系统异常请联系管理员\");\r\n" +
" location.href=\"login.do\";\r\n" +
"</script>");
}
}else {
out.print("<script>\r\n" +
" alert(\"密码不一致\");\r\n" +
" location.href=\"login.do\";\r\n" +
"</script>");
}
// 释放资源
DaoUtil.closeSource(sqlSession);
out.close();
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
@WebServlet("/main.do")
public class MainServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 处理乱码
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
// 获取资源
SqlSession sqlSession = DaoUtil.getSqlSession();
PrintWriter out = response.getWriter();
// 获取资源
String um = request.getParameter("username");
String up = request.getParameter("userpwd");
LoginMapper loMapper = sqlSession.getMapper(LoginMapper.class);
Login lo = loMapper.findLoginByLnameAndLpwd(um, up);
if(lo != null) {
out.print("<!DOCTYPE html>\r\n" +
"<html>\r\n" +
" <head>\r\n" +
" <meta charset=\"utf-8\">\r\n" +
" <title></title>\r\n" +
" </head>\r\n" +
" <body>\r\n" +
" <h1>首页</h1>\r\n" +
" <h1>用户名:"+um+"</h1>\r\n" +
" <h1>密码:"+up+"</h1>\r\n" +
" </body>\r\n" +
"</html>");
}else {
out.print("<script>\r\n" +
" alert(\"登录失败\");\r\n" +
" location.href=\"login.do\";\r\n" +
"</script>");
}
DaoUtil.closeSource(sqlSession);
out.close();
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
HttpServletRequest接口
方法名称
|
功能描述
|
String getContextPath( )
|
返回请求URI中表示请求上下文的路径,上下文路径是请求URI的开始部分
|
Cookie[ ] getCookies( )
|
返回客户端在此次请求中发送的所有cookie对象
|
HttpSession getSession( )
|
返回和此次请求相关联的session,如果没有给客户端分配session,则创建一个新的session
|
String getMethod( )
|
返回此次请求所使用的HTTP方法的名字,如GET、POST
|
String getHeader( String name )
|
返回指定的请求头信息
|
HttpSession接口
方法名称
|
说明
|
String getId()
|
获取sessionid
|
void setMaxInactiveInterval(int interval)
|
设定session的非活动时间
|
int getMaxInactiveInterval()
|
获取session的有效非活动时间(以秒为单位)
|
void invalidate()
|
设置session对象失效
|
void setAttribute(String key, Object value)
|
以key/value的形式保存对象值
|
Object getAttribute(String key)
|
通过key获取对象值
|
void removeAttribute(String key)
|
从session中删除指定名称(key)所对应的对象
|
会话技术:
session的创建:第一次请求时创建
session的结束:
ServletResponse接口
方法名称
|
功能描述
|
PrintWriter getWriter ( )
|
返回PrintWriter对象,用于向客户端发送文本
|
String getCharacterEncoding ( )
|
返回在响应中发送的正文所使用的字符编码
|
void setCharacterEncoding (String charset ) |
设置响应的字符编码
|
void setContentType ( String type )
|
设置发送到客户端的响应的内容类型,此时响应的状态属于尚未提交”text/html;charset=UTF-8”
|
HttpServletResponse接口
方法名称
|
功能描述
|
void addCookie ( Cookie cookie )
|
增加一个cookie到响应中,这个方法可多次调用,设置多个cookie
|
void addHeader ( String name,String value )
|
将一个名称为name,值为value的响应报头添加到响应中
|
void sendRedirect(String location)
|
发送一个临时的重定向响应到客户端,以便客户端访问新的URL
|
void encodeURL ( String url )
|
使用session ID对用于重定向的URL进行编码
|
servlet、request、session的作用域
作用域 | |
servlet | 整个应用程序 |
request | 只是那一次请求 |
session | 整个会话 |
cookie 和 session 的区别
数据存储的位置
|
存储的数据类型
|
生命周期
|
安全性
| |
cookie
|
浏览器
|
String类型
|
浏览器有关
|
不安全
|
session
|
服务器
|
Object类型
|
服务器有关
|
安全
|
servlet的生命周期:
servlet 开始:项目被 Tomcat 加载的时候
servlet 结束:关闭或重启服务器
实例化
Servlet 容器创建 Servlet 的实例
初始化
该容器调用 init ( ServletConfig ) 方法
服务
如果请求 Servlet,则容器调用 service() 方法
销毁
销毁实例之前调用 destroy() 方法
转发和重定向的区别:
转发:
一次请求和响应,
服务器的跳转,
带着上一次的请求和响应跳转到下一个页面
例:
//服务器的分发(转发)//服务器的跳转页面
request.getRequestDispatcher("login.do").forward(request,response);
重定向:
两次请求和响应,
浏览器页面的跳转,
浏览器页面的跳转不带数据
例:
response.sendRedirect("login.do");