javaweb 以登录注册来进行javaweb总结,新手都可以入手的案例

事情是这样的。。因为大二上学期,,大家都在用javaweb,jsp这些写期末作业,,,我心里也想快一年没碰这个了,总结一下吧,反正才开博客,可以总结一下吧,不然我是绝对不想碰jsp的。。。写的时候,还遇到坑,结果发现编译器问题,,最后eclipse、sts都用了没办法只能换idea开发工具来试一试,结果那个bug就好了。。。真诡异。。。。

源码下载地址https://download.csdn.net/download/xiaoxin0630/10876492

 

我们先总结一下javaweb的基础吧,然后再是小案例(总结是从各个pdf文档进行整理,摘取重要的)

Tomcat容器:按照Http协议的格式,把请求信息封装成Request对象,把响应信息封装成Response对象,所以Servlet实现类中就能够获取这两个对象。

 

request、out、response对象应用
• request:封装了由WEB浏览器或其它客户端生成地HTTP请求的
细节(参数,属性,头标和数据)
• request作用域:用户的请求周期
• out:代表输出流的对象
• response:封装了返回到HTTP客户端的输出,向页面作者提供设
置响应头标和状态码的方式

 

session、config、exception对象应用
• session:主要用于跟踪会话
• session作用域:会话期间
• config:获取配置信息
• exception:异常对象

一、Request和Response等其他常用方法

 

request的常用方法

request.getParameter("names");根据前端name的属性 键获取对应的值

setAttribute(String name,Object):设置一个name的名字,把值传递给name,前端可以进行接收显示

getAttribute(String name):返回由name指定的属性值

getAttributeNames():返回request 对象所有属性的名字集合,结果是一个枚举的实例

getCookies():获取客户端的所有 Cookie 对象

response 对象常用方法
response 对象代表的是对客户端的响应,也就是说可以通过 response 对象
来组织发送到客户端的数据,需要向客户端发送文字时直接使用。它是
HttpServletResponse 类的实例。
序号 方法(类型+方法名) 描述
1 String getCharacterEncoding() 返回响应用的是何种字符编码
2 ServletOutputStream getOutputStream() 返回响应的一个二进制输出流
3 PrintWriter getWriter() 返回可以向客户端输出字符的一个对象
4 void setContentLength(int len) 设置响应头长度

5 void setContentType(String type) 设置响应的 MIME 类型

session 常用方法
session 指的是客户端与服务器的一次会话,从客户连到服务器的一个
WebApplication 开始,直到客户端与服务器断开连接为止。它是 HttpSession 类的
实例

1 long getCreationTime() 返回 SESSION 创建时间

2 public String getId()返回 SESSION 创建时 JSP 引擎为设的惟一 ID 号

3 long getLastAccessedTime()返回此 SESSION 里客户端最近一求时间

 

out 常用方法
out 对象是 JspWriter 类的实例,是向客户端输出内容常用的对象

 

1.void clear() 清除缓冲区的内容

2.void clearBuffer() 清除缓冲区的当前内容

3.void flush() 清空流

4.int getBufferSize() 返回缓冲区以字节数的大小,如不设缓冲区

5.int getRemaining() 返回缓冲区还剩余多少可用

6.boolean isAutoFlush() 返回缓冲区满时,是自动清空还是抛出异常

7.void close() 关闭输出流

JSP

 

JSP声明语法
语法格式:
<%! String str = “hello world”; %>
定义成员变量,以及成员方法
不能直接包含程序

JSP程序脚本
语法格式:

<% out.print(“hello world”); %>
<% int i = 100; %>
<%
  if ( i > 10 ){
  out.print(“hello world”);
  }
%>

包括变量的声明、表达式和程序逻辑
声明的变量转换为_service方法中的变量,因而是局部变量
语句块可以自由地与将Java脚本与页面代码组合使用

 

<% int i = 100; %>
<% if ( i > 10 ){ %>
 <h1>这里是页面文本: i > 10</h1>
<% }else{ %>
 <h1>这里是页面文本: i <= 10</h1>
<%}%>

 

JSP包引入语法
语法格式:

<%@ page import =“java.util.*” %>
 不同的包引用被逗号隔开,作为一个整体字符串。
<%@ page import = “java.util.*,java.io.*” %>
<%@ page import =“java.io.*”

JSTL和EL表达式

EL表达式介绍及作用
Expression Language(表达式语言),目的是替代JSP页面中的复杂代码
• EL表达式语法:
${变量名}

 

JSTL介绍
– JSP标准标签库(JavaServerPages Standard Tag Library)
• 与EL表达式关系
- JSTL通常会与EL表达式合作实现JSP页面的编码
• JSTL开发准备
– 在JSP页面添加taglib指令:

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

JSTL常用标签介绍•

通用标签 set、out、remove
条件标签 if、choose

迭代标签 forEach

• set标签:将值保存到指定范围里– 将value值存储到范围为scope的变量variable中

<c:set var="username" value=" 张三 " scope=" scope "/>

out标签:将结果输出显式

<c:out value="value" />

remove标签:删除指定域内数据

<c:remove var=“username" scope="session"/>

 

EL表达式的语法有两个要素:$ 和 {}
• EL表达式可以使用“.”或者“[]”操作符在相应的作用域中取得某个
属性的值
• JSTL核心标签库中常用的标签有如下三类。
– 通用标签;<c:set>、<c:out>、<c:remove>
– 条件标签;<c:if>、<c:choose>、<c:when>、
<c:otherwise>
– 迭代标签:<c:forEach>
• EL表达式与JSTL标签结合使用,可以减少JSP中嵌入的Java代码,有
利于程序的维护和扩展

 

代码案例 servlet文件 使用注解

display.jsp 文件

 

运行结果

 

从运行结果可以看出,显示的request 而不是session,这是因为作用域的原因

每个作用域都对应一个 EL 中的名称,如下表格所示:作用域 EL 中的表示

作用域EL 中的
page

 pageScope

requestrequestScope
session

 sessionScope

application applicationScope

改为这样就可以显示session的

 

 

.和[]的使用

 

正则表达式

正则表达式语法规则

[abc]  a、b 或 c(简单类)

[a-zA-Z]a 到 z 或 A 到 Z,两头的字母包括在内(范围)

\d 数字:[0-9]

X{n}     X,恰好 n 次

X{n,}    X,至少 n 次

X{n,m}   X,至少 n 次,但是不超过 m

\D:非数字

\s:空白字符(如空格、\t制表位、\n换行等)

\S:非空白字符(除了空白字符以外的其他都可以)

\w:单词字符:[a-zA-Z_0-9\W:非单词字符在正则表达式中“^”表示正则的起始标记,“$“表示结束标记(可以不写)

介绍:正则表达式就是用一些特殊的符号来操作字符串,能简化书写
• 优缺点:能简化代码书写量,但是阅读性较差
• 常用数据校验:
1.用户名只能为字母,长度为6-12位:[a-zA-Z]{6,12}
2.密码只能为数字,长度至少为6位:[0-9]{6,},\\d{6,}
3.手机号校验:[1][3578]\\d{9}

4.邮箱校验:[a-zA-Z_0-9]{3,}@([a-zA-Z]+|\\d+)(\\.[a-zA-Z]+).

 

监听器

 

首先我们先看一下结构,我这里没用xml,用的注解。3.0版本以上就可以使用注解了

 

1.model层 也就是实体类,数据库的映射

2.首先dao层 也就是数据层 进行数据库的增删改查,进行数据库连接这些

3.server是业务层,调用数据层dao,进行添加用户和查询用户

4.servlet 我经常使用MVC架构,,所以我这里说控制层吧。 也就是api接口 前端提交数据这些 调用servlet层

5.utils 工具层,数据库连接,验证工具(我没写验证码,可以自己写,算是小扩展),MD5加密

 

数据库表创建

create table user(
	id int(32) not null auto_increment,
	username varchar(32) not null,
	password varchar(32) not null,
	createTime datetime not null,
	primary key(id)
)

实体类,映射实体类

package com.binglian.model;

import java.util.Date;

/**
 * 创建作者:冰怜
 * 创建时间:2018/12/25 16:49
 */
public class User {

	private int id;//用户编号
	private String username;
	private String password;
	private Date createTime;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public Date getCreateTime() {
		return createTime;
	}
	public void setCreateTime(Date createTime) {
		this.createTime = createTime;
	}
	
	
	
}

 

这里不多讲,然后我们接下数据库连接,

package com.binglian.utils;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

/**
 * 创建作者:冰怜
 * 创建时间:2018/12/25 21:49
 */
public class MySQLUtils {

    public static Connection getConnection() {
        String driver="com.mysql.jdbc.Driver";//mysql驱动,需要jar包
        String url="jdbc:mysql://localhost:3306/login";//数据库连接地址 login是数据库
        String username="root";//用户名   
        String password="root";//密码
        Connection connection=null;
        try{
            Class.forName(driver);//加载驱动
            connection=DriverManager.getConnection(url,username,password);//进行数据库连接
        }catch (ClassNotFoundException e) {
            e.printStackTrace();
        }catch (SQLException e) {
            e.printStackTrace();
        }
        return connection;
    }
}

然后是dao层,也就是底层

这里开始 就开始重点讲解

package com.binglian.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import com.binglian.utils.MD5Utils;
import com.binglian.utils.MySQLUtils;

/**
 * 创建作者:冰怜
 * 创建时间:2018/12/25 16:50
 */
public class UserDao {

	//根据用户名,查询密码,然后密码给业务层,进行校验
	public String findUser(String username){
		String psw=null;//等下要存的密码,返回的
		String sql="select * from user where username=?";//SQL语句 最后的问号,就是传过来的,等会会对应进去
		Connection con =MySQLUtils.getConnection();//调用数据库工具,进行连接
		PreparedStatement pstmt=null;//这个大家可以百度这个对象
		ResultSet rs=null;
		try{
			pstmt=con.prepareStatement(sql);//数据连接
			pstmt.setString(1, username);//这里的1对应就是SQL语句的问号,吧 username添加到sql语句里面
			rs=pstmt.executeQuery();//ִ进行SQL语句执行
			if (rs.next()) {//判断rs指向下一个数据 有没有。数据
				psw=rs.getString("password");
			}
		}catch (SQLException e) {
			e.printStackTrace();
		}finally {
			try{
				if(pstmt !=null)
					pstmt.close();//关闭
				if(con !=null)
					con.close();
			}catch (SQLException e) {
				e.printStackTrace();
			}
		}
		return psw;
	}

	//添加用户,
	public void addUser(String username,String password){
		Connection con=MySQLUtils.getConnection();
		PreparedStatement pstmt=null;
		String sql="INSERT INTO user(username,password,createTime) VALUES(?,?,?)";
		try {
			pstmt=con.prepareStatement(sql);//上面一样 的步骤 
			pstmt.setString(1, username);//一一对应?号 进行添加
			pstmt.setString(2, MD5Utils.md5(password));
			pstmt.setDate(3, new java.sql.Date(System.currentTimeMillis()));//这里的有特别,因为这里是时间 所以不能用string
用date  new java.sql.Date(System.currentTimeMillis())这个是当前时间
			pstmt.executeUpdate();//执行SQL语句
		} catch (SQLException e) {
			e.printStackTrace();
		}finally{
			try{
				if (pstmt !=null) 
					pstmt.close();
				if(con!=null)
					con.close();
			}catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}

	
	public static void main(String[] aegs){
                //测试
		System.out.println(new UserDao().findUser("11"));
		new UserDao().addUser("1123456", "123456");
	}
}

 

然后是service

package com.binglian.service;

import java.sql.SQLException;

import com.binglian.dao.UserDao;
import com.binglian.model.User;
import com.binglian.utils.MD5Utils;
import sun.security.provider.MD5;
/**
 * 创建作者:冰怜
 * 创建时间:2018/12/25 17:10
 */
public class UserService {

        //dao层对象实例化 就可以调用方法
	UserDao userDao=new UserDao();
	
	/**
	 * 添加一个用户
	 */
	public void register(String username,String password){
		//往数据库添加用户
		userDao.addUser(username, password);
	}
	
	/**
	 * 登录验证
	 */
	public boolean login(String username,String password){
		//1.查询
		String pwd=userDao.findUser(username);
		if(pwd.equals(MD5Utils.md5(password))){//因为数据库的密码已经加密 所以我们加密在进行判断
			return true;
		}else {
			return false;
		}
	}
}

注册控制层

package com.binglian.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;


import com.binglian.service.UserService;

/**
 * 创建作者:冰怜
 * 创建时间:2018/12/25 21:10
 */
@WebServlet("/regist")
public class RegistServlet extends HttpServlet {

	//server层
	UserService userService=new UserService();
	
	
	public void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException{
		request.setCharacterEncoding("utf-8");
		response.setContentType("textml;charset=utf-8");
		String username=request.getParameter("username");//获取前端传过来的用户
		String password=request.getParameter("password");//获取前端输入框name="password"的密码

        //我这里不进行任何校验,判断,如果自己要可以添加
			userService.register(username,password);
			request.setAttribute("msg", "注册成功");//返回给前端msg变量
			request.getRequestDispatcher("/index.jsp").forward(request, response);//进行跳转

	}

	public  void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException{
		doPost(request,response);
	}
	
	
}

登录控制层,和注册一样的逻辑

package com.binglian.servlet;

import com.binglian.service.UserService;



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;

/**
 * 创建作者:冰怜
 * 创建时间:2018/12/25 20:21
 */
@WebServlet("/login")
public class LoginServlet extends HttpServlet {

    public  void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException {
        doPost(request,response);
    }
    public void doPost(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException {
        UserService userService=new UserService();
        String username=request.getParameter("username");//获取前端传过来的数据
        String password=request.getParameter("password");


        if(userService.login(username,password)){//调用查询方法 进行判断。
            request.setAttribute("msg","2");//我这里用2代表登录成功
            request.getRequestDispatcher("/index.jsp").forward(request,response);
        }else{
            request.setAttribute("msg","1");//1表示失败
            request.getRequestDispatcher("/index.jsp").forward(request,response);
        }
    }
}

 前端页面 index.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
  </head>
  
  <body>
   <h1>欢迎</h1>
    <h2>${msg }</h2>
  </body>
</html>

 

登录login.jsp页面

<!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>Insert title here</title>
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
</head>
<body>
<center>
<div>
<h1>欢迎登陆</h1>
<form action="${pageContext.request.contextPath}/login" method="post">
	<table>
	<tr>
	<td width="66" align="right"><font size="3">帐号:</font></td><td colspan="2"><input type="text" name="username" style="width:200;height:25;"/></td>
	</tr>
	<tr>
	<td align="right">
        <font size="3">密码:</font>
        </td>
        <td colspan="2"><input type="text" name="password"  style="width:200;height:25;"/></td>
	</tr>
	<tr><td colspan="3" align="center">
        <input type="submit" value="登录" style="width:130;height:30;"/></td></tr>
	</table>
	</form>
	<a href="regist.jsp"><font size="2"><i>没有帐号?点击注册</i></font></a>
<font color="red" size="2"> ${msg}</font>
</div>
</center>
</body>
</html>

注册页面regist.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>

	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
 
  </head>
  
  <body>
  <center>
    <div>
    <h1>注册</h1>
    <form action="${pageContext.request.contextPath}/regist" method="post">
    请输入帐号:<input type="text" name="username"><br/>
    请输入密码:<input type="password" name="password"><br/>
    <button type="submit">注册</button>
    </form>
   <font color="red" size="2"> ${msg}</font>
    </div>
    </center>
  </body>
</html>

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值