功能实现
什么是JSP
html+java
5.完善注册、登录、详情页
html页面改用jsp
使用:<%java代码%>,展示用<%=“行了”%>
注册
修改RegisterServlet
改用转发方式跳转
原因:注意重定向是两次请求,存在第一次请求中的数据会在它发送第二次请求时消失,就不能在页面获取展示出来
}else{//不允许注册
// //利用重定向跳转到注册页面
// response.sendRedirect("register.html");
//将提示信息存在请求里
request.setAttribute("msg","注册失败 -- 账号已存在");
//利用转发跳转到注册页面
request.getRequestDispatcher("register.jsp").forward(request,response);
}
register.jsp
原有基础加两段代码
对于改用jsp后,就可解决在页面提示:展示提示信息
<%String msg = (String) request.getAttribute("msg");%>
<%=(msg !=null)?msg:""%>
登录
修改LoginServlet
添加将数据存储到Session中
登录成功,将数据存储到Session中,方便详情页获取展示,跳转详情页就用重定向
登录失败,对于提示信息和跳转的处理同注册
if(sysCode.equalsIgnoreCase(userCode)){//验证码正确
if(user != null){//登录成功
//将数据存储到Session中
HttpSession session = request.getSession();
session.setAttribute("username",user.getUsername());
session.setAttribute("name",user.getName());
session.setAttribute("role",role);
response.sendRedirect("index.jsp");
}else{//登录失败 -- 账号或密码错误
// response.sendRedirect("login.html");
request.setAttribute("msg","登录失败 -- 账号或密码错误");
request.getRequestDispatcher("login.jsp").forward(request,response);
}
}else{//登录失败 - 验证码错误
// response.sendRedirect("login.html");
//将提示信息存在请求里
request.setAttribute("msg","登录失败 -- 验证码错误");
//利用转发跳转到注册页面
request.getRequestDispatcher("login.jsp").forward(request,response);
}
}
}
login.jsp
原有基础加两段代码
<%
String msg = (String) request.getAttribute("msg");
%>
<%=(msg!=null)?msg:""%>
详情页
index.jsp
获取存在session中的数据进行学生或者老师信息展示,添加一些后续功能的入口
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
String username = (String) session.getAttribute("username");
String name = (String) session.getAttribute("name");
String role = (String) session.getAttribute("role");
%>
<button >安全退出</button>
<h1>详情页面</h1>
<h1>欢迎<%=name%><%=("student".equals(role))?"学员":""%><%=("teacher".equals(role))?"老师":""%>进入到学生管理系统</h1>
<a href="#">修改密码</a>
<%if("student".equals(role)){%>
<a href="#">修改信息</a>
<%}%>
<%if("teacher".equals(role)){%>
<a href="#">修改信息</a>
<a href="#">查看所有学生</a>
<%}%>
</script>
</body>
</html>
6.记住我
实现:存Session、存Cookie
修改LoginServlet
添加存凭证
1.当第一次登录时,点击了“记住我”,就会存凭证【username、name、role合起来是一个凭证】存在Cookie中
2.再次登录就会判断,是否有凭证
有,直接跳详情页面,不过在跳转前会将凭证存在session中【因为详情页展示需要session的数据】
没有,就不管,就用户直接输入登录
if(user != null){//登录成功
//判断是否记住我
if(rememberMe != null){
//将凭证添加到Cookie中
response.addCookie(CookieUtils.createCookie("username",user.getUsername(),60*60*24*5));
response.addCookie(CookieUtils.createCookie("name",user.getName(),60*60*24*5));
response.addCookie(CookieUtils.createCookie("role",role,60*60*24*5));
}
//将数据存储到Session中
HttpSession session = request.getSession();
session.setAttribute("username",user.getUsername());
session.setAttribute("name",user.getName());
session.setAttribute("role",role);
response.sendRedirect("index.jsp");
}else{//登录失败 -- 账号或密码错误
}
修改login.jsp
添加凭证判断跳转
获取请求中存在session中的数据,进行凭证判断,有就直接跳转详情,没有就用户直接输入登录
<body>
<%
Cookie[] cookies = request.getCookies();
if(cookies != null){
int count = 0;
for (Cookie cookie : cookies) {
String name = cookie.getName();
//解码类解码
String value = URLDecoder.decode(cookie.getValue(),"UTF-8");
if("username".equals(name)){
session.setAttribute("username",value);
count++;
}
if("name".equals(name)){
session.setAttribute("name",value);
count++;
}
if("role".equals(name)){
session.setAttribute("role",value);
count++;
}
}
if(count == 3){
response.sendRedirect("index.jsp");
}
}
%>
</body>
新增工具类CookieUtils
public class CookieUtils {
public static Cookie createCookie(String name,String value,int time){
Cookie cookie = null;
try {
//注意:数据有中文必须设置编码格式
cookie = new Cookie(name, URLEncoder.encode(value,"UTF-8"));
//设置过期时间
cookie.setMaxAge(time);
return cookie;
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
}
}
}
7.安全退出
实现:删Session、删Cookie
SafeExitServlet
@WebServlet("/SafeExitServlet")
public class SafeExitServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//删除Cookie里的数据
response.addCookie(CookieUtils.createCookie("username","",0));
response.addCookie(CookieUtils.createCookie("name","",0));
response.addCookie(CookieUtils.createCookie("role","",0));
//删除Session里的数据
HttpSession session = request.getSession();
session.removeAttribute("username");
session.removeAttribute("name");
session.removeAttribute("role");
//跳转
response.sendRedirect("welcome.html");
}
}
修改index.jsp
<button οnclick="safeExit()">安全退出</button>
<script type="text/javascript">
function safeExit(){
window.location = "SafeExitServlet";
}
</script>
8.修改密码
注意:在写代码时考虑代码冗余,应先考虑代码的可读性
新增ResetPasswordServlet
- 设置请求、响应编码格式
- 获取请求中的数据
- 通过username、password查询数据库中的用户对象
- 通过用户对象进行判断
用户存在,判断角色修改密码,注意要做安全退出【不然在有记住我的情况下,第二次登录直接进来】
用户不存在,设置提示修改密码失败信息,又转发方式跳转回到修改密码页面
@WebServlet("/ResetPasswordServlet")
public class ResetPasswordServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置请求、响应编码格式
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
//获取请求中的数据
String username = request.getParameter("username");
String password = request.getParameter("password");
String newPassword = request.getParameter("newPassword");
String role = request.getParameter("role");
//方案1
// String username = (String) request.getSession().getAttribute("username");
// String role = (String) request.getSession().getAttribute("role");
//通过username、password查询数据库中的用户对象
User user = null;
try {
if("student".equals(role)){
user = DBUtils.commonQueryObj(Student.class, "select * from student where username=? and password=?", username, password);
}else if("teacher".equals(role)){
user = DBUtils.commonQueryObj(Teacher.class, "select * from teacher where username=? and password=?", username, password);
}
//通过用户对象进行判断
if(user != null){
if("student".equals(role)){
DBUtils.commonUpdate("update student set password=? where username=?",newPassword,username);
}else if("teacher".equals(role)){
DBUtils.commonUpdate("update teacher set password=? where username=?",newPassword,username);
}
//修改密码成功后,做安全退出的功能
request.getRequestDispatcher("SafeExitServlet").forward(request,response);
}else{
request.setAttribute("msg","修改密码失败 -- 原密码不正确");
request.getRequestDispatcher("resetPassword.jsp").forward(request,response);
}
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}
修改index.jsp
<a href="resetPassword.jsp">修改密码</a>
新增resetPassword.jsp
需要展示页面就要先获取session中的username
要用户输入就原密码和新密码【对于为什么要原密码,就是在用户电脑在登录情况下被别人直接改密码】
注意1:对于ResetPasswordServlet查询用户对象,是需要username和role,怎么获取?
方案1:ResetPasswordServlet直接通过session获取【session里面存的有】
// String username = (String) request.getSession().getAttribute("username"); // String role = (String) request.getSession().getAttribute("role");
方案2:在这个表单直接请求传过去,ResetPasswordServlet就可以在请求中取
方案2更好,方案一不但太麻烦,而且对于数据一处取可读性更高
注意2:方案2也有两种传法【get、post】,get会在地址栏显示,不好
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
String username = (String) session.getAttribute("username");
String role = (String) session.getAttribute("role");
String msg = (String) request.getAttribute("msg");
%>
<%=(msg!=null)?msg:""%>
//ResetPasswordServlet?username=<%=username%>&role=<%=role%>也能传,但是会在浏览器地址栏显示
<form action="ResetPasswordServlet" method="post">
<!--隐藏域-->
<input type="hidden" name="username" value="<%=username%>"/>
<input type="hidden" name="role" value="<%=role%>"/>
账号:<%=username%><br/>
原密码:<input type="password" name="password"/><br/>
新密码:<input type="password" name="newPassword"/><br/>
<input type="submit" value="修改"/>
<input type="button" value="返回" οnclick="goIndex()"/>
</form>
<script type="text/javascript">
function goIndex(){
window.location = "index.jsp";
}
</script>
</body>
</html>
9.修改学生信息
新增StuInitModifyServlet
初始化修改学生数据
- 设置请求、响应编码格式
- 获取请求中的数据
- 从数据库中获取学生对象
- 将学生对象存在请求中,转发方式到学生修改信息页面stuInfo.jsp
@WebServlet("/StuInitModifyServlet")
public class StuInitModifyServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置请求、响应编码格式
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
//获取请求中的数据
String username = request.getParameter("username");
//从数据库中获取学生对象
Student student = null;
try {
student = DBUtils.commonQueryObj(Student.class, "select * from student where username=?", username);
} catch (SQLException e) {
throw new RuntimeException(e);
}
request.setAttribute("student",student);
request.getRequestDispatcher("stuInfo.jsp").forward(request,response);
}
}
新增StuModifyServlet
- 设置请求、响应编码格式
- 获取请求中的数据
- 更新数据库里的学生数据
- 更新Session里的数据【原因:可能改名字,如果不改还是原来的名字就会在使用时出错】
- 更新Cookie里的数据【可存可不存,还是存一下,Cookie只有记住我才会有数据,name涉及凭证】
- 重定向方式跳转到详情页面index.jsp
@WebServlet("/StuModifyServlet")
public class StuModifyServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置请求、响应编码格式
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
//获取请求中的数据
String username = request.getParameter("username");
String name = request.getParameter("name");
String sex = request.getParameter("sex");
String age = request.getParameter("age");
String[] hobbies = request.getParameterValues("hobbies");
//更新数据库里的学生数据
try {
DBUtils.commonUpdate("update student set name=?,sex=?,age=?,hobbies=? where username=?",name,sex,age, StringUtils.handleArray(hobbies),username);
} catch (SQLException e) {
throw new RuntimeException(e);
}
//更新Session里的数据
request.getSession().setAttribute("name",name);
//更新Cookie里的数据
response.addCookie(CookieUtils.createCookie("name",name,60*60*24*5));
response.sendRedirect("index.jsp");
}
}
新增stuInfo.jsp
对于没有直接进行学生信息处理【因为没有修改学生的年龄,性别,爱好信息】,需要先到StuInitModifyServlet获取到学生对象,再获取其中信息,用来修改页面展示和表单发送StuModifyServlet中的修改
注意:对性别和爱好的选择处理
<%@ page import="com.qf.pojo.Student" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
Student student = (Student) request.getAttribute("student");
%>
<h1>学生修改信息页面</h1>
<form action="StuModifyServlet" method="post">
<input type="hidden" name="username" value="<%=student.getUsername()%>"/>
账号:<%=student.getUsername()%><br/>
姓名:<input type="text" name="name" value="<%=student.getName()%>"/><br/>
年龄:<input type="text" name="age" value="<%=student.getAge()%>"/><br/>
性别:
<input type="radio" name="sex" value="man" <%=(student.getSex().equals("man"))?"checked='checked'":""%>/>男
<input type="radio" name="sex" value="woman" <%=(student.getSex().equals("woman"))?"checked='checked'":""%>/>女
<br/>
爱好:
<input type="checkbox" name="hobbies" value="football" <%=(student.getHobbies().contains("football"))?"checked='checked'":""%>/>足球
<input type="checkbox" name="hobbies" value="basketball" <%=(student.getHobbies().contains("basketball"))?"checked='checked'":""%>/>篮球
<input type="checkbox" name="hobbies" value="shop" <%=(student.getHobbies().contains("shop"))?"checked='checked'":""%>/>购物
<br/>
<input type="submit" value="修改"/>
<input type="button" value="返回" οnclick="goIndex()"/>
</form>
<script type="text/javascript">
function goIndex(){
window.location = "index.jsp";
}
</script>
</body>
</html>
修改index.jsp
在跳转的同传username的原因【使StuInitModifyServlet可以拿到账号到数据库查询到改账号的学生信息】
<%if("student".equals(role)){%>
<a href="StuInitModifyServlet?username=<%=username%>">修改信息</a>
<%}%>
10.修改老师信息
新增TeaInitModifyServlet
初始化修改老师数据
- 设置请求、响应编码格式
- 获取请求中的数据
- 从数据库中获取老师对象
- 将老师对象和课程集合对象存在请求中,转发方式到老师修改信息页面teaInfo.jsp
@WebServlet("/TeaInitModifyServlet")
public class TeaInitModifyServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置请求、响应编码格式
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
//获取请求中的数据
String username = request.getParameter("username");
//从数据库中获取相应的数据
Teacher teacher = null;
List<Course> courses = null;
try {
teacher = DBUtils.commonQueryObj(Teacher.class,"select * from teacher where username=?",username);
courses = DBUtils.commonQueryList(Course.class,"select * from course");
} catch (SQLException e) {
throw new RuntimeException(e);
}
//存入请求对象中
request.setAttribute("teacher",teacher);
request.setAttribute("courses",courses);
//跳转页面
request.getRequestDispatcher("teaInfo.jsp").forward(request,response);
}
}
新增TeaModifyServlet
- 设置请求、响应编码格式
- 获取请求中的数据
- 更新数据库里的老师数据
- 更新Session里的数据【原因:可能改名字,如果不改还是原来的名字就会在使用时出错】
- 更新Cookie里的数据【可存可不存,还是存一下,Cookie只有记住我才会有数据,name涉及凭证】
- 重定向方式跳转到详情页面index.jsp
@WebServlet("/TeaModifyServlet")
public class TeaModifyServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置请求、响应编码格式
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
//获取请求中的数据
String username = request.getParameter("username");
String name = request.getParameter("name");
String sex = request.getParameter("sex");
String age = request.getParameter("age");
String courseId = request.getParameter("courseId");
//更新数据库里的学生数据
try {
DBUtils.commonUpdate("update teacher set name=?,sex=?,age=?,courseId=? where username=?",name,sex,age, courseId,username);
} catch (SQLException e) {
throw new RuntimeException(e);
}
//更新Session里的数据
request.getSession().setAttribute("name",name);
//更新Cookie里的数据
response.addCookie(CookieUtils.createCookie("name",name,60*60*24*5));
response.sendRedirect("index.jsp");
}
}
teaInfo.jsp
对于没有直接进行老师信息处理【因为没有修改老师的年龄,性别信息】,需要先到TeaInitModifyServlet获取到老师对象,再获取其中信息,用来修改页面展示和表单发送TeaModifyServlet中的修改
注意:对性别和学科选择的处理
对于学科考虑到会新增的情况,不能写死,通过获取学科集合再遍历的方式进行选择展示
<%@ page import="com.qf.pojo.Teacher" %>
<%@ page import="java.util.List" %>
<%@ page import="com.qf.pojo.Course" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
Teacher teacher = (Teacher) request.getAttribute("teacher");
List<Course> courses = (List<Course>) request.getAttribute("courses");
%>
<h1>老师修改信息页面</h1>
<form action="TeaModifyServlet" method="post">
<input type="hidden" name="username" value="<%=teacher.getUsername()%>"/>
账号:<%=teacher.getUsername()%><br/>
姓名:<input type="text" name="name" value="<%=teacher.getName()%>"/><br/>
年龄:<input type="text" name="age" value="<%=teacher.getAge()%>"/><br/>
性别:
<input type="radio" name="sex" value="man" <%=(teacher.getSex().equals("man"))?"checked='checked'":""%>/>男
<input type="radio" name="sex" value="woman" <%=(teacher.getSex().equals("woman"))?"checked='checked'":""%>/>女
<br/>
学科:
<select name="courseId">
<% for(Course course : courses){%>
<option value="<%=course.getId()%>" <%=(course.getId() == teacher.getCourseId())?"selected='selected'":""%> ><%=course.getName()%></option>
<% }%>
</select>
<br/>
<input type="submit" value="修改"/>
<input type="button" value="返回" οnclick="goIndex()"/>
</form>
<script type="text/javascript">
function goIndex(){
window.location = "index.jsp";
}
</script>
</body>
</html>
修改index.jsp
在跳转的同传username的原因【使TeaInitModifyServlet可以拿到账号到数据库查询到改账号的老师信息】
<%if("teacher".equals(role)){%>
<a href="TeaInitModifyServlet?username=<%=username%>">修改信息</a>
<a href="#">查看所有学生</a>
<%}%>