根据课堂案例,分层设计,连接数据库
1、登录
成功:查询所有用户信息,然后转到主页home.jsp
失败:回到登录页面
2、注册
成功:转到登录页面
失败:继续注册
3、查询所有用户信息
通过JSTL标准标签库和EL表达式展示数据
注意:
1.页面元素<%@page..%>中添加属性isELIgnored="false"取消忽略EL表达式
2.注意添加<%@taglib..%> 引入JSTL标准标签库
自己的代码比较粗糙而且我使用了lombok插件:
这个是实体类pojo,懂得都懂,不懂就问。
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Student {
private int id;
private String username;
private String pwd;
private String phone;
private String name;
}
util我使用的是之前用的有点出入单,不影响我的代码运行:
public class Dbhelp {
public Connection getconn() {
Connection conn=null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn= DriverManager.getConnection("jdbc:mysql://localhost:3306/mjh","root","123456");
} catch (ClassNotFoundException | SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return conn;
}
public static void main(String[] args) {
System.out.println(new Dbhelp().getconn());
}
}
如何接口:一个全查一个添加:
public interface studentDao {
Student login(String username, String pwd);
List<Student> findAll();
int addStudent(Student s);
}
然后是实现类:
ublic class studentImpl implements studentDao {
Connection conn=null;
PreparedStatement ps=null;
ResultSet rs=null;
@Override
public Student login(String username, String pwd) {
String sql="select * from student where username=? and pwd=?";
conn=new Dbhelp().getconn();
Student s=null;
try {
ps=conn.prepareStatement(sql);
ps.setString(1, username);
ps.setString(2, pwd);
rs=ps.executeQuery();
if(rs.next()) {
s=new Student();
s.setId(rs.getInt(1));
s.setUsername(rs.getString(2));
s.setPwd(rs.getString(3));
s.setPhone(rs.getString(4));
s.setName(rs.getString(5));
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return s;
}
@Override
public List<Student> findAll() {
List<Student> li=new ArrayList<Student>();
conn=new Dbhelp().getconn();
String sql="select id,username,pwd,phone,name from student";
try {
ps=conn.prepareStatement(sql);
rs=ps.executeQuery();
while(rs.next()) {
Student s=new Student();
s.setId(rs.getInt(1));
s.setUsername(rs.getString(2));
s.setPwd(rs.getString(3));
s.setPhone(rs.getString(4));
s.setName(rs.getString(5));
li.add(s);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return li;
}
@Override
public int addStudent(Student s) {
int flag=0;
String sql="insert into student(username,pwd,phone,name) values(?,?,?,?);";
conn=new Dbhelp().getconn();
try {
ps=conn.prepareStatement(sql);
ps.setString(1, s.getUsername());
ps.setString(2, s.getPwd());
ps.setString(3, s.getPhone());
ps.setString(4, s.getName());
flag=ps.executeUpdate();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return flag;
}
}
接下来就是service了我没有写在一个里面方法不是很多就分开单独写了:
第一个是登录,第二个是添加,第三个是全查
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("login");
//接受请求
studentDao sd=new studentImpl();
//执行请求
String username = req.getParameter("username");
String pwd = req.getParameter("pwd");
Student s = sd.login(username, pwd);
if (s != null) {
System.out.println(s);
System.out.println("登入成功");
HttpSession session = req.getSession();
session.setAttribute("s", s);
req.getRequestDispatcher("home").forward(req, resp);
} else {
System.out.println("登入失败");
req.getRequestDispatcher("login.jsp").forward(req,resp);
}
}
//add
//
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html; charset=UTF-8");
studentDao sd=new studentImpl();
String username=req.getParameter("username");
String pwd=req.getParameter("pwd");
String phone=req.getParameter("phone");
String name=req.getParameter("name");
//接下来把数据存到数据库,所以需要一个student对象来存放这些数据
Student s=new Student();
s.setUsername(username);
s.setPwd(pwd);
s.setPhone(phone);
s.setName(name);
if(s.getName()!=null &&s.getName()!=""){
//把数据存到数据库。
int i=sd.addStudent(s);
System.out.println(i);
//应该使用重定向,把之前新增的这个操作到此截断。后续在查询的这里重复
resp.sendRedirect("login");
}else {
req.getRequestDispatcher("add.jsp").forward(req, resp);
}
}
//home
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
studentDao sd=new studentImpl();
List<Student> li=sd.findAll();
req.setAttribute("aa", li);
System.out.println(li);
//请求转发,跳转到前台把它显示出来.因为需要带着值,所以使用请求转发.
req.getRequestDispatcher("home.jsp").forward(req, resp);
}
然后就是前台代码了样式比较low:
<body>
<h1>请登入</h1>
<form action="login" method="post">
请输入账号:<input type="text" name="username" value="zhangsan"placeholder="请输入用户名" /><br />
请输入密码:<input type="password" name="pwd" value="123456"placeholder="请输入密码" /><br/>
<input type="submit" value="登陆"/>
</form>
<a href="add.jsp">注册</a>
</body>
add;
<form action="add" method="post" style="align-content: center">
请输入账号:<input type="text" name="username"/>
<br/>请输入密码:<input type="password" name="pwd"/>
<br/>请输入手机号:<input type="text" name="phone"/>
<br/> 请输入名字:<input type="text" name="name" />
<br/><input type="submit" name="" value="提交"/>
<input type="reset" name="" value="清空"/>
</form>
</body>
home:
<body>
<span>
<% Student ss= (Student) session.getAttribute("s");%>
欢迎你:<%=ss.getName() %>
</span>
<h1>登录成功</h1>
<table border="1px" width="800px">
<tr>
<td>编号</td>
<td>账号</td>
<td>密码</td>
<td>手机号</td>
<td>姓名</td>
</tr>
<%
//这是获取后台创来的集合.getAttribute()方法的参数时后台传过来的集合的代号.
List<Student> li = (List<Student>) request.getAttribute("aa");
//使用for循环遍历.
for (Student s : li) {
%>
<tr>
<td><%=s.getId()%></td>
<td><%=s.getUsername()%></td>
<td><%=s.getPwd()%></td>
<td><%=s.getPhone()%></td>
<td><%=s.getName()%></td>
</tr>
<%
}
%>
</table>
</body>
还有待改善就这有凑活看吧,运行截图就不放了