一个简单的登录
package com.cdsxt.action;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class UserServlet extends HttpServlet {
private Map<String, String> userMap=new HashMap<String, String>();
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//设置请求编码
//request.setCharacterEncoding(编码集)
//请求设置编码的这个方法,默认只能对请求实体进行编码(只能对post有效),如果想对get方式同时有效,需要在配置端口号的地方,添加一个属性
//useBodyEncodingForURI="true"
request.setCharacterEncoding("utf-8");
//获取请求的标记,判断走的分支
String mark=request.getParameter("mark");
if("regis".equals(mark)){
userRegis(request, response);
}else if("login".equals(mark)){
userLogin(request,response);
}
}
/**
* 用户登陆
* @param request
* @param response
* @throws ServletException
* @throws IOException
*/
public void userLogin(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//设置响应编码
response.setHeader("content-type", "text/html;charset=utf-8");
//获取表单参数
String uname=request.getParameter("uname");
System.out.println(uname);
String pwd=request.getParameter("pwd");
//获取PrintWriter对象
PrintWriter pw=response.getWriter();
if(uname.isEmpty()||pwd.isEmpty()){
pw.write("<h1>登陆信息填写不完整,即将返回登陆页面!</h1>");
response.setHeader("refresh", "3;url=login.html");
}else{
//获取正确密码
String rightPwd=userMap.get(uname);
if(pwd.equals(rightPwd)){
pw.write("<h1>登陆成功,欢迎"+uname+"使用本系统!</h1>");
}else{
pw.write("<h1>用户名或密码错误,即将返回登陆页面!</h1>");
response.setHeader("refresh", "3;url=login.html");
}
}
}
/**
* 用户注册
*/
public void userRegis(HttpServletRequest request,HttpServletResponse response)
throws ServletException, IOException {
//设置响应编码
response.setHeader("content-type", "text/html;charset=utf-8");
//获取表单参数
String uname=request.getParameter("uname");
System.out.println(uname);
String pwd=request.getParameter("pwd");
String repwd=request.getParameter("repwd");
//获取PrintWriter对象
PrintWriter pw=response.getWriter();
if(uname.isEmpty()||pwd.isEmpty()||repwd.isEmpty()){
pw.write("<h1>注册信息填写不完整,即将返回注册页面!</h1>");
response.setHeader("refresh", "3;url=regis.html");
}else if(!pwd.equals(repwd)){
pw.write("<h1>两次密码输入不一致,即将返回注册页面!</h1>");
response.setHeader("refresh", "3;url=regis.html");
}else if(userMap.containsKey(uname)){
pw.write("<h1>该名字已经被注册,即将返回注册页面!</h1>");
response.setHeader("refresh", "3;url=regis.html");
}else{
//将用户名和密码保存到map容器
userMap.put(uname, pwd);
//跳转到登陆页面
pw.write("<h1>注册成功,即将跳转到登陆页面!</h1>");
response.setHeader("refresh", "3;url=login.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 = "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;
}
}
}
servlet跳转的两种方式的特点:
请求转发:
语法:
request.getRequestDispacher(地址).forward(请求对象,响应对象)
特点:
1)整个过程只有一次请求
2)地址不会发生改变
3)不能访问外部资源
4)效率偏高
5)绝对路径的/ 代表根目录之后的/
6)一般习惯性在请求转发之后调用一个return
重定向:
语法:
response.sendRedirect(地址)
特点:
1)整个过程只有两次请求
2)地址会发生改变
3)能访问外部资源
4)效率偏低
5)绝对路径的/ 代表端口号之后的/
6)一般习惯性在重定向之后调用一个return
路径总结:
请求转发的绝对路径的/ 代表的是根目录之后
重定向的绝对路径的/ 代表的是端口号之后
页面的绝对路径的/ 代表的是端口号之后
文件下载
public void download(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 设置下载的指定编码集,浏览器只支持iso8859-1
String file = new String("下载的电影.rar".getBytes("utf-8"),"iso8859-1");
// 设置下载的响应头
response.setHeader("content-disposition", "attachment;filename="+file);
// 设置 输入流
InputStream is = new FileInputStream("D:/电影.rar");
// 设置输出流 response.getOutputStream(),将资源输出到浏览器
OutputStream out = response.getOutputStream();
// 输出资源
int len = 0;
byte[] b = new byte[8192];
while((len=is.read(b))!=-1){
out.write(b,0,len);
}
// 刷新
out.flush();
// 关流
out.close();
is.close();
}
ServletConfig对象
作用:
用于获取web.xml中的配置信息
需要掌握的方法:
获取config对象:
this.getServletConfig()
获取<servlet-name>的值:
config对象.getServletName()
获取<init-param>的值:
通过键获取值:
config对象.getInitParameter(键名) 返回String
获取键集合:
config对象.getInitParameterNames() 返回Enumeration
获取ServletContext对象:
config对象.getServletContext()
ServletContext对象(Application):
获取context对象:
this.getServletContext()
作为作用域使用:
基本的四个方法。
获取<context-param>标签的值:
通过键获取值:
context对象.getInitParameter(键名) 返回String
获取键集合:
context对象.getInitParameterNames() 返回Enumeration
获取webroot下的资源(重要):
获取资源的运行绝对路径:
context对象.getRealPath(路径) 返回String
将资源以流的方式读入:
context对象.getResourceAsStream(路径) 返回InputStream
获取目录下的资源路径集合:
context对象.getResourcePaths(目录的路径) 返回Set<String>
注意点:
使用ServletContext对象的方法,如果需要传入路径写不写/都是代表绝对路径,并且绝对路径的/代表WebRoot,使用这个对象的方法全部加上/即可。
Cookie对象:
特点:
1)保存在客户端上
2)不适合保存大量数据
3)效率低
4)不安全
语法:
创建cookie对象:
new Cookie(键,值)
设置cookie的有效期:
cookie对象.setMaxAge(秒数)
响应cookie对象给浏览器:
response.addCookie(cookie对象)
获取客户端上的cookie信息:
request.getCookies() --> Cookie[]
注意:
1)如果没有设置cookie的有效期则保存在内存中,当浏览器关闭,则内存中的所有cookie全部清空。设置了有效期,则会被保存在硬盘上,有效期一过就会失效。
2)使cookie立即失效,创建一个同键的cookie,将时间置为0,响应给客户端即可。
session会话对象:
特点:
1)保存在服务器的
2)适合保存大量数据(一般只用来保存用户信息)
3)效率高
4)安全的
语法:
获取session对象:
request.getSession()
作为作用域使用:
四个方法
设置最大空闲时间:
session对象.setMaxInactiveInterval(秒数)
注意:
1)最大空闲时间和最大有效期的区别
2)如果没有设置最大空闲时间,默认是看web.xml中的<session-config>配置,不修改是30分钟
使session强制失效:
session对象.invalidate()
什么叫一次会话(session的作用范围)
简单的说,打开浏览器,访问服务器,直到浏览器关闭,称为一次会话。严格的说,根据session的生成机制。
session的生成机制:
首先服务器必须调用request.getSession(),如果请求头中没有jsessionId则服务器一定会创建一个新的session对象,如果请求头中有jsessionId则服务器会找到对应的session对象,如果该对象已经失效,则会创建一个新的session对象,如果没有失效则使用找到的这个session对象。
request的作用范围:同一次请求,一次请求
session的作用范围:同一次会话,关闭浏览器,默认30分钟有效期结束
servletContext(Application)的作用范围:同一web项目,关闭服务器