User.java
package com.bean;
public class xzk_User {
String userid;
String password;
public String getUserid() {
return userid;
}
public String getPassword() {
return password;
}
public void setUseid(String id) {
userid=id;
}
public void setPassword(String pw) {
password=pw;
}
}
index.jsp
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>首页</title>
</head>
<body>
<jsp:forward page="login.jsp"></jsp:forward>
</body>
</html>
login.jsp
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>登录</title>
<style type="text/css"> div{text-align:center}</style>
</head>
<body>
<div>
<form name="reg" action="/2019_11_14_xzk.test/XZK_LoginServlet" method="post">
用户名:<input name="userid" type="text" size="30"/><br />
密 码 :<input name="password" type="password" size="30"/><br />
验证码:<input type="text" name="check_code" size="20">
<img src="XZK_CheckServlet"><br />
<input type="submit" value="提交" id="bt" />
</form>
</div>
<!-- JSP页面的普通注释:注释的内容是可见的,将出现在生成的HTML代码中,此代码将发送给
浏览器,然后由浏览器负责忽略此注释。 -->
<%-- JSP页面中的隐藏注释:标记的内容客户端查看源码时是完全看不到的。 --%>
<% // JSP中java代码块单行注释:客户端不可见 %>
<% /* JSP中java代码块多行注释:客户端不可见 */ %>
</body>
</html>
LoginServlet.java
package com.loginPage;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.bean.xzk_User;
public class XZK_LoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=utf-8");
String userid=req.getParameter("userid");
String password=req.getParameter("password");
String checkCode=req.getParameter("check_code");
String savedCode=(String )req.getSession().getAttribute("check_code");
PrintWriter pw=resp.getWriter();
if(("xzk").equals(userid)&&("521").equals(password)&&checkCode.equals(savedCode)) {//少验证码验证部分
xzk_User user=new xzk_User();
user.setUseid(userid);
user.setPassword(password);
req.getSession().setAttribute("user", user);
resp.sendRedirect("/2019_11_14_xzk.test/main.jsp");
}else if(checkCode.equals(savedCode)){
pw.write("用户名或密码错误,登陆失败,请您重新输入");
}else {
pw.write("验证码错误");
}
//response.getWriter().append("Served at: ").append(request.getContextPath());
}
public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(req, resp);
}
}
main.jsp
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8" import="com.bean.*"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>首页</title>
<style>
*{
padding:0;
margin:0;
font-family:"微软雅黑";
}
.header{
height:72px;
background:#458fce ;
}
.header .logo{
color:#fff ;
line-height:70px;
font-size:30px;
margin-left:20px;
display:inline-block;
text-align:center;
}
a {
color: #fff ;
text-decoration: none ;
}
.header .login{
float:right;
color:#fff ;
line-height:72px;
margin-right:2px;
display:inline-block;
}
.banner{
height:380px;
overflow:hidden;
background: #ddd;
}
</style>
</head>
<body>
<div class="header">
<div class="logo">JavaWeb实验一</div>
<div class ="login">
<a href ="/2019_11_14_xzk.test/XZK_IndexServlet">个人中心</a>
<span>|</span>
<a href ="/2019_11_14_xzk.test/XZK_LoginOutServlet">退出</a>
</div>
</div>
<br />
用户名:xzk
<%
xzk_User u=(xzk_User)new xzk_User();
%>
<!-- JSP页面的普通注释:注释的内容是可见的,将出现在生成的HTML代码中,此代码将发送给浏览器,然后由浏览器负责忽略此注释。 -->
<%-- JSP页面中的隐藏注释:标记的内容客户端查看源码时是完全看不到的。 --%>
<% // JSP中java代码块单行注释:客户端不可见 %>
<% /* JSP中java代码块多行注释:客户端不可见 */ %>
</body>
</html>
IndexServlet.java
package com.loginPage;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import com.bean.xzk_User;
public class XZK_IndexServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
HttpSession session = request.getSession();
xzk_User user = (xzk_User) session.getAttribute("user");
if(user == null){
response.getWriter().print("你还没有登陆或输入用户名,请重新登录<a href='/2019_11_14_xzk.test/main.jsp'>进入首页</a>");
} else {
response.getWriter().print("你已经登陆成功欢迎你" + user.getUserid() + "!");
response.getWriter().print("<a href='/2019_11_14_xzk.test/XZK_LoginOutServlet'>退出</a>");
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
LoginoutServlet.java
package com.loginPage;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class XZK_LoginOutServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.getSession().removeAttribute("userid");
resp.sendRedirect("/2019_11_14_xzk.test/index.jsp");
//response.getWriter().append("Served at: ").append(request.getContextPath());
}
public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
CheckServlet.java
package com.loginPage;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.awt.*;
import java.awt.image.*;
import javax.imageio.ImageIO;
public class XZK_CheckServlet extends HttpServlet
{
private static final long serialVersionUID = 1L;
private static int WIDTH = 60; //验证码图片宽度
private static int HEIGHT = 20; //验证码图片高度
public void doGet(HttpServletRequest request,HttpServletResponse response)
throws ServletException,IOException{
HttpSession session = request.getSession();
response.setContentType("image/jpeg");
ServletOutputStream sos = response.getOutputStream(); response.setHeader("Pragma","No-cache");
response.setHeader("Cache-Control","no-cache");
response.setDateHeader("Expires", 0);
BufferedImage image =
new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
Graphics g = image.getGraphics();
char [] rands = generateCheckCode();
drawBackground(g);
drawRands(g,rands);
g.dispose();
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ImageIO.write(image, "JPEG", bos);
byte [] buf = bos.toByteArray();
response.setContentLength(buf.length);
sos.write(buf);
bos.close();
sos.close();
session.setAttribute("check_code",new String(rands));
}
private char [] generateCheckCode()
{
String chars = "0123456789abcdefghijklmnopqrstuvwxyz";
char [] rands = new char[4];
for(int i=0; i<4; i++)
{
int rand = (int)(Math.random() * 36);
rands[i] = chars.charAt(rand);
}
return rands;
}
private void drawRands(Graphics g , char [] rands)
{
g.setColor(Color.BLACK);
g.setFont(new Font(null,Font.ITALIC|Font.BOLD,18));
g.drawString("" + rands[0],1,17);
g.drawString("" + rands[1],16,15);
g.drawString("" + rands[2],31,18);
g.drawString("" + rands[3],46,16);
System.out.println(rands);
}
private void drawBackground(Graphics g)
{
g.setColor(new Color(0xDCDCDC));
g.fillRect(0, 0, WIDTH, HEIGHT);
for(int i=0; i<120; i++)
{
int x = (int)(Math.random() * WIDTH);
int y = (int)(Math.random() * HEIGHT);
int red = (int)(Math.random() * 255);
int green = (int)(Math.random() * 255);
int blue = (int)(Math.random() * 255);
g.setColor(new Color(red,green,blue));
g.drawOval(x,y,1,0);
}
}
}
总结:刚一开始不明白JSP与html文件的具体区别,在理解上出了问题,后来通过查阅,明白JSP相对于html是会产生动态页面,且JSP只有发布到Tomcat服务器上才能打开,而html是直接可以打开的。另外能熟练掌握区分JSP中三种注释:JSP普通注释,JSP隐藏注释还有java代码注释。熟练掌握JSP语言的page属性值以及标识性动作forward的用法。