02系统页面创建&系统需求分析
2.2 简答题
2.2.1 根据视频,请写出登录功能的实现思路?
1、 用户点击登录发送请求到UserServlet, tomcat服务器接收到请求后调用UserServlet中service方法进行请求处理,并将封存了相关数据的 request对象和response对象作为实参传递给service方法
2、在UserServlet中调用业务层方法进行登录业务处理
3、在业务层方法中调用Dao层方法完成数据库操作
4、完成功能跳转
2.2.2 视频中要完成的三个功能需求分别是?
M:model service层和dao层和实体类层
V:view 视图层 jsp页面等
C:controller 控制层 servlet
2.3 编程题
2.3.1 根据视频讲解,独立完成主页面模板的套用实现。
03登录Servlet创建和MVC思想
3.1 编程题
3.2.1 根据视频中的需求分析,使用MySQL完成用户信息表的创建,将表创建语句和测试数据SQL作为答案
3.2.2 修改登录页面数据提交的action地址
截图作为答案
3.2.3 创建登录Servlet,并在Servlet完成编码设置,已经登录信息的获取的代码的编写,将实现代码粘贴作为答案
package com.sxt.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.sxt.pojo.User;
import com.sxt.service.UserService;
import com.sxt.service.impl.UserServiceImpl;
public class UserServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// 设置请求编码格式
req.setCharacterEncoding("utf-8");
// 设置响应编码格式
resp.setContentType("text/html;charset=utf-8");
// 获取请求信息
String uname= req.getParameter("uname");
String pwd=req.getParameter("pwd");
// 处理请求信息
System.out.println(uname+":"+pwd);
//创建业务层对象
UserService us = new UserServiceImpl();
User u= us.getUserInfoService(uname,pwd);
System.out.println("用户查询结果"+u);
// 响应处理信息
// 直接响应
// 重定向
// 请求转发
}
}
3.2.4 修改登录页面中表单中用户名和密码提交的键名,,将修改后的表单代码粘贴作为答案
<form action="user" method="post">
<div class="panel loginbox">
<div class="text-center margin-big padding-big-top"><h1>后台管理中心</h1></div>
<div class="panel-body" style="padding:30px; padding-bottom:10px; padding-top:10px;">
<div class="form-group">
<div class="field field-icon-right">
<input type="text" class="input input-big" name="uname" placeholder="登录账号" data-validate="required:请填写账号" />
<span class="icon icon-user margin-small"></span>
</div>
</div>
<div class="form-group">
<div class="field field-icon-right">
<input type="password" class="input input-big" name="pwd" placeholder="登录密码" data-validate="required:请填写密码" />
<span class="icon icon-key margin-small"></span>
</div>
</div>
<div class="form-group">
<div class="field">
<input type="text" class="input input-big" name="code" placeholder="填写右侧的验证码" data-validate="required:请填写右侧的验证码" />
<img src="images/passcode.jpg" alt="" width="100" height="32" class="passcode" style="height:43px;cursor:pointer;" οnclick="this.src=this.src+'?'">
</div>
</div>
</div>
<div style="padding:30px;"><input type="submit" class="button button-block bg-main text-big input-big" value="登录"></div>
</div>
</form>
3.2.5 简述MVC的编程思想及其好处
04MVC实现登录查询用户信息(A)
4.3编程题
4.3.1 根据视频讲解,在项目中完成MVC中service层和Dao的创建,只需要完成借口及其实现类的创建,先不声明功能方法。
4.3.2 根据视频创建User实体类
package com.sxt.pojo;
public class User {
private int uid;
private String uname;
private String pwd;
private String sex;
private int age;
private String birthday;
public int getUid() {
return uid;
}
public void setUid(int uid) {
this.uid = uid;
}
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getBirthday() {
return birthday;
}
public void setBirthday(String birthday) {
this.birthday = birthday;
}
public User() {
super();
// TODO Auto-generated constructor stub
}
@Override
public int hashCode() {
// TODO Auto-generated method stub
return super.hashCode();
}
@Override
public boolean equals(Object obj) {
// TODO Auto-generated method stub
return super.equals(obj);
}
@Override
public String toString() {
return "User [uid=" + uid + ", uname=" + uname + ", pwd=" + pwd
+ ", sex=" + sex + ", age=" + age + ", birthday=" + birthday
+ "]";
}
}
4.3.3 根据视频讲解导入MySQL的jar包,并导入数据库操作工具类以及db.properties的配置
导入的位置:
4.3.4 根据视频完成业务层和数据库层功能代码实现
业务层:
Service.java
package com.sxt.service;
import com.sxt.pojo.User;
public interface UserService {
User getUserInfoService(String uname, String pwd);
}
package com.sxt.service.impl;
import com.sxt.dao.UserDao;
import com.sxt.dao.impl.UserDapImpl;
import com.sxt.pojo.User;
import com.sxt.service.UserService;
import com.sxt.servlet.UserServlet;
public class UserServiceImpl implements UserService {
UserDao ud=new UserDapImpl();
@Override
public User getUserInfoService(String uname, String pwd) {
// TODO Auto-generated method stub
//处理登录业务(从数据库查询,用dao层对象)
return ud.getUserInfoDao(uname,pwd);
}
}
数据库层:
UserDao.java
package com.sxt.dao;
import com.sxt.pojo.User;
import com.sxt.servlet.UserServlet;
public interface UserDao {
User getUserInfoDao(String uname, String pwd);
}
UserDaoImpl.java
public class UserDapImpl implements UserDao {
//查询用户信息
@Override
public User getUserInfoDao(String uname, String pwd) {
// TODO Auto-generated method stub
Connection conn=null;
PreparedStatement ps=null;
ResultSet rs=null;
//
User u=null;
try {
//创建连接
conn=DBUtil.getConnection();
//创建sql命令
String sql="select * from t_user where uname=? and pwd=?";
//创建sql命令对象
ps = conn.prepareStatement(sql);
// 给占位符赋值
ps.setString(1, uname);
ps.setString(2, pwd);
// 执行dql语句
rs = ps.executeQuery();
// 遍历---判断是否有rs才能判断是否创建user
while (rs.next()) {
//给变量赋值
u=new User();
u.setUid(rs.getInt("uid"));
u.setUname(rs.getString("uname"));
u.setPwd(rs.getString("pwd"));
u.setSex(rs.getString("sex"));
u.setAge(rs.getInt("age"));
u.setBirthday(rs.getString("birthday"));
}
// 关闭资源
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
DBUtil.closeAll(rs, ps, conn);
}
// 返回结果
//
return u;
}
4.3.5 根据视频讲解运行项目在后台打印查询到的用户信息。
05用户登录失败和成功处理
5.1 编程题
5.1.1 根据视频讲解,完成登录失败重定向登录页面,并在登录页面显示提示语 用户名或密码错误
获取session对象
HttpSession hs = req.getSession();
if (u!=null) {
hs.setAttribute("user", u);
resp.sendRedirect("/pro/main.jsp");
} else {
hs.setAttribute("flag", "loginFalse");
resp.sendRedirect("/pro/login.jsp");
}
5.1.2 完成退出登录按钮的添加。
<div class="head-l " style="position: relative;left: 960px;"><span style="font-size: 15px ; color: red">当前用户:<%=((User)session.getAttribute("user")).getUname()%></span> <a class="button button-little bg-red" href="login.html"><span class="icon-power-off"></span> 退出登录</a> </div>
5.1.3 完成登录成功,重定向主页面代码实现。并在主页显示当前登录的用户。
06用户退出功能实现
6.2 上级练习
6.2.1 简述用户退出的实现思路
在outServlet中获取session对象,session对象一旦获取,本次会话就结束。重定项指向登录页面。在主页面中的
Href设置为out一旦用户点击退出登录,就当前页面就跳转到登录页面
6.2.2 声明并创建Servlet处理用户退出登录的请求。
package com.sxt.servlet;
import java.io.IOException;
import javax.jms.Session;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class OutServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// 设置请求编码格式
req.setCharacterEncoding("utf-8");
// 设置响应编码格式
resp.setContentType("text/html;charset=utf-8");
//获取session对象
HttpSession hs = req.getSession();
//销毁session对象
hs.invalidate();
resp.sendRedirect("/pro/login.jsp");
}
}
6.2.3 修改退出登录按钮的herf地址为退出登录的Servlet路径,然后运行项目,点击退出登录查看运行效果
6.2.3 修改代码给退出登录按钮添加退出提示语。
07创建用户注册页面(1)
7.1 编程题
7.1.1 根据视频讲解,在登录页面中添加注册按钮。
7.1.2 根据视频讲解,创建注册页面并将套用模板内容。
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<html lang="zh-cn">
<head>
<base href="<%=basePath%>">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
<meta name="renderer" content="webkit">
<title></title>
<link rel="stylesheet" href="css/pintuer.css">
<link rel="stylesheet" href="css/admin.css">
<script src="js/jquery.js"></script>
<script src="js/pintuer.js"></script>
</head>
<body>
<div class="panel admin-panel">
<div class="panel-head"><strong><span class="icon-key"></span> 用户注册</strong></div>
<div class="body-content">
<form method="post" class="form-x" action="reg">
<div class="form-group">
<div class="label">
<label for="sitename">用户名:</label>
</div>
<div class="field">
<input type="password" class="input w50" id="mpass" name="mpass" size="50" placeholder="请输入用户名" data-validate="required:请输入用户名" />
</div>
</div>
<div class="form-group">
<div class="label">
<label for="sitename">新密码:</label>
</div>
<div class="field">
<input type="password" class="input w50" name="newpass" size="50" placeholder="请输入新密码" data-validate="required:请输入新密码,length#>=5:新密码不能小于5位" />
</div>
</div>
<div class="form-group">
<div class="label">
<label for="sitename">确认新密码:</label>
</div>
<div class="field">
<input type="password" class="input w50" name="renewpass" size="50" placeholder="请再次输入新密码" data-validate="required:请再次输入新密码,repeat#newpass:两次输入的密码不一致" />
</div>
</div>
<div class="form-group">
<div class="label">
<label></label>
</div>
<div class="field">
<button class="button bg-main icon-check-square-o" type="submit"> 提交</button>
</div>
</div>
</form>
</div>
</div>
</body></html>
7.1.3 根据视频讲解,修改注册页面原有模板内容,修改为我们自己的注册页面,并添加用户性别选项。
08创建用户注册页面(2)
8.1 编程题
8.1.1 根据视频讲解,完成用户性别选择功能。
<!-- 性别 -->
<div class="form-group">
<div class="label">
<label>性别:</label>
</div>
<div class="field">
<div class="button-group radio">
<label class="button active">
<span class=" icon-check" id="manSpan"></span>
<input name="isshow" value="1" type="radio" id="man" checked="checked">男
</label>
<label class="button active"><span class="" id="womanSpan"></span>
<input name="isshow" value="0" type="radio" id="woman" checked="checked">女
</label>
</div>
</div>
</div>
8.1.2 完善注册页面,添加用户年龄和出生日期选项
<!-- 年龄 -->
<div class="form-group">
<div class="label">
<label for="sitename">用户年龄:</label>
</div>
<div class="field">
<input type="text" class="input w50" id="mpass" name="age"
size="50" placeholder="请输入年龄" data-validate="required:请输入年龄" />
</div>
</div>
<!--出生日期 -->
<div class="form-group">
<div class="label">
<label for="sitename">出生日期:</label>
</div>
<div class="field">
<input type="date" class="input w50" id="mpass" name="birthday"
size="50" />
</div>
</div>
09用户注册功能实现
9.1 编程题
9.1.1 根据视频讲解,继续完成注册页面,修改注册页面表单数据提交的键名。
9.1.2 创建并声明处理注册功能的Servlet
package com.sxt.servlet;
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.sxt.service.UserService;
import com.sxt.service.impl.UserServiceImpl;
public class RegServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// 设置请求编码格式
req.setCharacterEncoding("utf-8");
// 设置响应编码格式
resp.setContentType("text/html;charset=utf-8");
// 获取请求信息
String uname=req.getParameter("uname");
String pwd=req.getParameter("pwd");
String sex=req.getParameter("sex");
int age=Integer.parseInt(req.getParameter("age"));
String birthday=req.getParameter("birthday");
//处理请求信息
//获取请求业务
UserService us=new UserServiceImpl();
//处理注册
int i=us.regUserInfoService(uname,pwd,sex,age,birthday);
//获取Session对象
HttpSession hs=req.getSession();
if (i>0) {
resp.sendRedirect("/pro/login.jsp");
} else {
//重定向到注册页面
resp.sendRedirect("/pro/login.jsp");
}
}
}
9.1.3 完成注册功能的业务层和数据库层的代码
业务层
数据库层:
UserDao.java
UserDaoImpl.java
9.1.4 在regServlet中完成注册成功和注册失败的代码逻辑,然后运行项目,点击注册观察运行效果。
10注册成功提示语&项目问题引入和解决方案
10.1 编程题
10.1.1 根据视频讲解,完成注册成功提示语功
10.1.2 视频中目前项目存在的问题是什么?
如何在service方法中实现根据请求动态的调用其功能处理方法呢?
使用反射。
11service中实现动态调用请求处理方法(1)
11.1 编程题
11.1.1 根据视频创建DataServlet,并声明登录,退出,注册三个方法。
11.1.2 根据视频讲解在DataServlet中的service方法中完成动态调用方法处理请求的反射代码的编写
//获取请求信息
String methodName=req.getParameter("method");
System.out.println("DataServlet.service(当前请求方法名为:)"+methodName);
//调用方法处理请求
try {
//反射获取方法所在的类获取的对象
Class cla = this.getClass();
//反射获取要被调用的方法对象
Method m= cla.getMethod(methodName, HttpServletRequest.class,HttpServletResponse.class);
//执行方法属于反射的方法
m.invoke(this, req,resp);
} catch (Exception e) {
e.printStackTrace();
}
12service中实现动态调用请求处理方法(2)
12.1 编程题
12.1.1 根据视频讲解完善DataServlet中登录,注册,退出方法的中的代码实现。
登录
public void userLogin(HttpServletRequest req, HttpServletResponse resp) throws IOException{
System.out.println("DataServlet.userLogin(开始处理用户登录请求)");
//获取请求信息
String uname=req.getParameter("uname");
String pwd=req.getParameter("pwd");
//处理请求信息
System.out.println(uname+":"+pwd);
//创建业务层对象
UserService us=new UserServiceImpl();
User u=us.getUserInfoService(uname,pwd);
System.out.println("用户登录查询结果为:"+u);
//响应处理结果
//创建或者获取session对象
HttpSession hs=req.getSession();
if(u!=null){//登录成功
//将用户信息存储到session中
hs.setAttribute("user",u);
//重定向到main.jsp
resp.sendRedirect("/pro2/main.jsp");
}else{//登录失败
//将登录失败的标记添加到session中
hs.setAttribute("flag", "loginFalse");
//重定向到login.jsp
resp.sendRedirect("/pro2/login.jsp");
}
}
注册
public void userReg(HttpServletRequest req, HttpServletResponse resp) throws IOException{
System.out.println("DataServlet.userReg(用户注册开始处理)");
//获取请求信息
String uname=req.getParameter("uname");
String pwd=req.getParameter("pwd");
String sex=req.getParameter("sex");
int age=Integer.parseInt(req.getParameter("age"));
String birthday=req.getParameter("birthday");
//处理请求信息
//获取业务层对象
UserService us=new UserServiceImpl();
//处理注册
int i=us.regUserInfoService(uname,pwd,sex,age,birthday);
//响应处理结果
//获取Session对象
HttpSession hs=req.getSession();
//重定向到登录页面
if(i>0){
//给注册成功添加标记到session中
hs.setAttribute("flag", "regSuccess");
resp.sendRedirect("/pro2/login.jsp");
}else{
//重定向到注册页面
resp.sendRedirect("/pro2/login.jsp");
}
}
退出
public void userOut(HttpServletRequest req, HttpServletResponse resp) throws IOException{
System.out.println("DataServlet.userOut(用户退出开始处理)");
//获取请求信息
//处理请求信息
//获取session
HttpSession hs = req.getSession();
//销毁session
hs.invalidate();
//响应处理结果
//重定向
resp.sendRedirect("/pro2/login.jsp");
}
12.1.2 修改登录页面在表单中添加隐藏便签,添加请求数据中的方法名,完成登录功能
12.1.3 修改退出按钮,完成退出功
12.1.4 修改注册页面,完成注册功能
12.1.5 视频中最后提出的问题是什么?
现在使用反射我们实现了在service方法中动态的根据请求调用对应的方法进行请求处理。
但是真实开发过程中,虽然不会每个功能都创建一个servlet,但是也不会只使用一个Servlet,我们的Servlet不只是一个,一般是一个独立的功能模块一个Servlet。我们需要在这些Servlet中的service方法中都要将反射代码声明一遍。
13-向上抽取BaseServlet类
13.1 编程题
13.1.1 根据视频,完成BaseServlet的创建
package com.sxt.servlet;
import java.io.IOException;
import java.lang.reflect.Method;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public abstract class BaseServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// 设置请求编码格式
req.setCharacterEncoding("utf-8");
// 设置响应编码格式
resp.setContentType("text/html;charset=utf-8");
//获取请求信息
String methodName=req.getParameter("method");
System.out.println("DataServlet.service(当前请求方法名为:)"+methodName);
//调用方法处理请求
try {
//反射获取方法所在的类获取的对象
Class cla = this.getClass();
//反射获取要被调用的方法对象
Method m= cla.getMethod(methodName, HttpServletRequest.class,HttpServletResponse.class);
//执行方法属于反射的方法
m.invoke(this, req,resp);
} catch (Exception e) {
e.printStackTrace();
}
}
}
13.1.2 根据视频,修改DataServlet继承BaseServlet
然后启动项目重新访问相关功能。
基本功能均能实现
13.1.3 BaseServlet的使用流程是?
1、创建Servlet继承BaseServlet即可。
2、在自己的servlet中不要声明service方法,只要书写请求处理功能方法即可。
3、正常请求我们自己的servlet
注意:
请求必须附带要被执行的方法名
14-项目总结和缺陷
14.1 简答题
14.1.1 视频中项目总结的六个内容是?
1、套用模版进行页面快速构建
在自己的项目中创建jsp文件
然后将模版中的前端相关代码赋值到自己的jsp文件中
将静态资源复制到webRoot下
2、MVC的开发流程
M:model service dao pojo
v:view jsp js css html
c:controller Servlet
3、Servlet+jsp+jdbc的功能开发流程
1、浏览器发起页面请求直接给jsp
2、浏览器发起功能请求给servlet,servlet调用service,service进行业务逻辑处理,
service调用dao,dao层进行数据库操作(jdbc),dao层将处理结果返回给service
service再将结果返回给servlet,(或者继续请求转发或者重定向其他Servlet继续处理) ,
请求转发或者重定向给jsp,jsp做出页面响应。
4、request和session作用域的使用
request:请求转发的数据流转的载体
session:重定向的数据流转的载体(但是session可以解决同一个用户的不同请求的数据库共享问题)。
5、浏览器发起请求到服务器请求发起的方式(重点记忆)
非ajax请求
form表单提交:action数据提交地址,method:数据提交方式
超链接标签:href:为数据提交地址,可以直接使用?拼接请求数据,类似form表单的get请求方式。
js中的window.location.herf:为数据提交地址,可以直接使用?拼接请求数据,类似form表单的get请求方式。
注意:
使用以上请求方式发起的请求,浏览器在接收到响应内容后,会将原有内容覆盖,显示响应结果。
6、BaseServlet的抽取和使用
反射
抽象类
14.1.2 根据视频,项目目前仍然存在的缺陷是?
1、在jsp中获取从Servlet流转过来的数据特别麻烦
2、在jsp页面中使用java代码块进行逻辑处理书写和阅读极不方便
3、使用session进行数据流转是很方便的,但是session失效了,所有依赖session的功能都会出问题。
4、响应结果都是覆盖原有内容显示给用户