创建User类
package servlet_user;
import java.util.Date;
public class User {
private String name;
private String password;
private int age;
private Date birth;
public User() {
super();
}
public User(String name, String password, int age, Date birth) {
super();
this.name = name;
this.password = password;
this.age = age;
this.birth = birth;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Date getBirth() {
return birth;
}
public void setBirth(Date birth) {
this.birth = birth;
}
@Override
public String toString() {
return "User [name=" + name + ", password=" + password + ", age=" + age + ", birth=" + birth + "]";
}
}
创建一个Userdatebase,用来操作User
package servlet_user;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
public class UserDatebase {
private static Map<String, User> users = new HashMap<>();
//产生对象时自动调用一次静态代码块,用来产生user对象
static {
for(int i=0;i<5;i++) {
User user = new User();
user.setName("cyg"+i);
user.setPassword("123"+i);
user.setAge(16+i);
user.setBirth(new Date());
users.put(user.getName(), user);
}
}
//根据name返回对应的User
public User getByName(String name) {
return users.get(name);
}
//返回所有的User
public Collection<User> seletAll(){
return users.values();
}
//根据name删除User
public User deleteByName(String name) {
return users.remove(name);
}
}
登录页面
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<!-- 设置该文件的对应路径为该工程路径,可以不用设置.注意路径可能会不同
设置以后可以解决路径跳转错误的问题
-->
<base href="/servlet_mvn_jd2007/">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>登录界面</title>
</head>
<body>
<form action="login.do" method="post">
用户名:<input type="text" name="username" ><br/>
密 码:<input type="password" name="password"><br/>
<input type="submit" value="提交">
</form>
</body>
</html>
登录判断的servlet类
package servlet_user;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.RequestDispatcher;
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;
//通过注解的方式,就不需要在web.xml中配置信息了,name可以省略.推荐使用该方法
/*@WebServlet(name="life2",urlPatterns="/life2.do",loadOnStartup=3,
initParams = {
@WebInitParam(name="param1",value = "abc"),
@WebInitParam(name="param2",value = "def"),
}
)*/
@WebServlet("/login.do")
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置编码格式,防止乱码
resp.setCharacterEncoding("UTF-8");
req.setCharacterEncoding("UTF-8");
resp.setContentType("text/html;charset=UTF-8");
String uname = req.getParameter("username");
System.out.println(uname);
String password = req.getParameter("password");
UserDatebase ud = new UserDatebase();
User user = ud.getByName(uname);
System.out.println(user);
PrintWriter pw = resp.getWriter();
if(user==null) {
//如果用户不存在
pw.println("<font color='red' size='3'>用户名错误请重新输入</font>");
pw.flush();
System.out.println("用户名错误");
RequestDispatcher rd = req.getRequestDispatcher("html/login2.html");
rd.include(req, resp);
}else if (!user.getPassword().equals(password)) {
//用户存在判断对应的密码和该密码是否相等
pw.println("<font color='red' size='3'>密码错误请重新输入</font>");
pw.flush();
System.out.println("密码错误");
RequestDispatcher rd = req.getRequestDispatcher("html/login2.html");
rd.include(req, resp);
}else {
pw.println("成功登陆");
//创建session对象用于在一次会话中永久传递name的值
HttpSession session = req.getSession();
session.setAttribute("name", uname);
//跳转到显示所有用户的servlet界面
RequestDispatcher rd = req.getRequestDispatcher("allUsers.do");
rd.include(req, resp);
}
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
}
展示所有用户信息的servlet类
package servlet_user;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Collection;
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;
@WebServlet("/allUsers.do")
public class AlluserServlet extends HttpServlet{
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String name = req.getParameter("username");
UserDatebase ud = new UserDatebase();
Collection<User> users = ud.seletAll();
//利用servlet写HTML页面,来展示所有的用户信息
resp.setContentType("text/html;charset=UTF-8");
PrintWriter pw = resp.getWriter();
pw.println("<html>");
pw.println("<head>");
pw.println("<meta charset='UTF-8'>");
pw.println("<title>用户列表</title>");
pw.println("</head>");
pw.println("<body>");
//创建session对象用于接受longing传递过来的用户名,优点是可以在一次会话中永久保存.
//如果没有改对象重新访问时name会为null,因为每一次的request都是一个新的请求
HttpSession session = req.getSession();
Object obj = session.getAttribute("name");
pw.println("<p style=\"margin-left: 100px\">欢迎:"+obj+"</P>");
pw.println("<table border='1'>");
pw.println("<tr>");
pw.println("<td>姓名</td>");
pw.println("<td>密码</td>");
pw.println("<td>年龄</td>");
pw.println("<td>生日</td>");
pw.println("<td>操作</td>");
pw.println("</tr>");
users.forEach(user->{
pw.println("<tr>");
pw.println("<td>"+user.getName()+"</td>");
pw.println("<td>"+user.getPassword()+"</td>");
pw.println("<td>"+user.getAge()+"</td>");
pw.println("<td>"+user.getBirth()+"</td>");
//href后面跟上要跳到的对应地址?后面跟上参数name的值,用于后面的操作时获取到对应的User
pw.println("<td><a href='deleteByName.do?name="+user.getName()+"'>删除</a>"
+ "/<a href='html/changeuser.html?name="+user.getName()+"'>修改</a></td>");
pw.println("</tr>");
});
pw.println("</table>");
pw.println("</body>");
pw.println("</html>");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
删除用户的servlet类
package servlet_user;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//通过注解的方式,就不需要在web.xml中配置信息了,name可以省略.推荐使用该方法
/*@WebServlet(name="life2",urlPatterns="/life2.do",loadOnStartup=3,
initParams = {
@WebInitParam(name="param1",value = "abc"),
@WebInitParam(name="param2",value = "def"),
}
)*/
@WebServlet("/deleteByName.do")
public class DeleteUser extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置编码格式,防止乱码
resp.setCharacterEncoding("UTF-8");
req.setCharacterEncoding("UTF-8");
//设置输出到页面的格式和编码格式
resp.setContentType("text/html;charset=UTF-8");
//根据参数名获取参数
String name = req.getParameter("name");
UserDatebase ud = new UserDatebase();
User user = ud.getByName(name);
PrintWriter pw = resp.getWriter();
pw.println("已经删除用户:"+user);
ud.deleteByName(name);
//利用服务器内部跳转,跳到指定界面.include可以保存原有信息(forward会清空原有信息)
req.getRequestDispatcher("allUsers.do").include(req, resp);
//resp.sendRedirect("allUsers.do");
//req.getRequestDispatcher("allUsers.do").forward(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
修改用户信息的页面
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<!-- 设置该文件的对应路径为该工程路径,可以不用设置.注意路径可能会不同 -->
<base href="/servlet_mvn_jd2007/">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>修改用户信息界面</title>
</head>
<body>
<h1>请输入要修改的信息</h1>
<form action="change.do" method="post">
原名:<input type="text" name="name"><br/>
新名:<input type="text" name="username"><br/>
密码:<input type="password" name="password"><br/>
年龄:<input type="text" name="age"><br/>
<input type="submit" value="提交">
</form>
</body>
</html>
修改用户信息的servlet类
package servlet_user;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//通过注解的方式,就不需要在web.xml中配置信息了,name可以省略.推荐使用该方法
/*@WebServlet(name="life2",urlPatterns="/life2.do",loadOnStartup=3,
initParams = {
@WebInitParam(name="param1",value = "abc"),
@WebInitParam(name="param2",value = "def"),
}
)*/
@WebServlet("/change.do")
public class ChangeUser extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置编码格式,防止乱码
resp.setCharacterEncoding("UTF-8");
req.setCharacterEncoding("UTF-8");
resp.setContentType("text/html;charset=UTF-8");
//根据参数名获取参数
String name = req.getParameter("name");
String usename = req.getParameter("username");
String password = req.getParameter("password");
String age1 = req.getParameter("age");
//把string类型转换为int类型
int age = Integer.valueOf(age1);
UserDatebase ud = new UserDatebase();
User user = ud.getByName(name);
user.setName(usename);
user.setPassword(password);
user.setAge(age);
PrintWriter pw = resp.getWriter();
pw.println("修改后的用户为:"+user);
//服务器内部跳转
req.getRequestDispatcher("/allUsers.do").include(req, resp);;
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
现在有一个要求在没有登录的情况下不可以访问,展示所有用户信息的界面和修改,删除的界面.
分析:可以用过滤器filter来实现
用一个类来实现Filter类并重写里面的方法
package servlet_user;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
//过滤器用于防止未登录的用户访问除登录界面外的其他界面
public class UserFilter implements Filter{
public UserFilter() {
System.out.println("Filter---------被创建了-----------");
}
@Override
public void destroy() {
System.out.println("Filter---------destroy--------------方法");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println("Filter---------doFilter--------------方法");
//设置编码格式,用于提示用户要登录后才可以访问其他页面
response.setContentType("text/html;charset=UTF-8");
//强转后才可以调用以下方法
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse resp = (HttpServletResponse) response;
//创建session对象,用于判断用户是否已经登录
HttpSession session = req.getSession();
String name = (String) session.getAttribute("name");
if(session==null || name==null) {
PrintWriter pw = resp.getWriter();
pw.println("<H2 style=\"color: red\">请先登录</H2>");
req.getRequestDispatcher("html/login2.html").include(req, resp);
//重定向的跳转方式
//resp.sendRedirect("html/login2.html");
}else {
//将请求继续向下传递
chain.doFilter(request, response);
}
}
@Override
public void init(FilterConfig config) throws ServletException {
System.out.println("Filter---------init--------------方法");
}
}
过滤器filter也要配置xml信息才可以使用,也可以利用注解的方式来配置信息
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>servlet_jd2007</display-name>
<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>
<servlet>
<!-- 配置filter,URL中的是要过滤的页面或者servlet -->
<filter>
<filter-name>userFilter</filter-name>
<filter-class>servlet_user.UserFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>userFilter</filter-name>
<url-pattern>/allUsers.do</url-pattern>
<url-pattern>/change.do</url-pattern>
<url-pattern>/deleteByName.do</url-pattern>
<url-pattern>/html/changeuser.html</url-pattern>
</filter-mapping>
</web-app>