jsp点击跳转_尚学堂042——jsp+servlet整合

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作为答案

718ebd238b9c3b282816f276854023f3.png

3.2.2 修改登录页面数据提交的action地址

047415ca02e793c6c192d8a88d91adb0.png

截图作为答案

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的创建,只需要完成借口及其实现类的创建,先不声明功能方法。

6c8f583c1f822ea195cc648181d88529.png

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的配置

ae9625ccb70259d346a650a6384d9911.png

导入的位置:

5dbc55042a248e3c0617005c1b3da35e.png

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 根据视频讲解运行项目在后台打印查询到的用户信息。

acf15f0a399e8afa699813147b071862.png

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");

}

3044eee0623a1bbe7724f625be054739.png

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>&nbsp;&nbsp;<a class="button button-little bg-red" href="login.html"><span class="icon-power-off"></span> 退出登录</a> </div>

5.1.3 完成登录成功,重定向主页面代码实现。并在主页显示当前登录的用户。

349ba2c34e8aa4066c64a365d77208e2.png

06用户退出功能实现

6.2 上级练习

6.2.1 简述用户退出的实现思路

在outServlet中获取session对象,session对象一旦获取,本次会话就结束。重定项指向登录页面。在主页面中的

9c00c9e22085131391fd666a83cd2293.png

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路径,然后运行项目,点击退出登录查看运行效果

cee4d6e240623d97d794dd8657c2e63d.png

6.2.3 修改代码给退出登录按钮添加退出提示语。

0610130d6fc7d14259eb6fbd4b01c17b.png

189f224888b616f03bba61bcdb629a2e.png

07创建用户注册页面(1)

7.1 编程题

7.1.1 根据视频讲解,在登录页面中添加注册按钮。

4360e13efa128d8ca75666b8f4a8a9ec.png

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 根据视频讲解,修改注册页面原有模板内容,修改为我们自己的注册页面,并添加用户性别选项。

d3dd5d42204f9cd0a5274ae4b48281a2.png

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 根据视频讲解,继续完成注册页面,修改注册页面表单数据提交的键名。

e431511444f8e590d2674603fcaaa75d.png

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 完成注册功能的业务层和数据库层的代码

业务层

1c640d787235cb7b3fa5efea4bdaa15d.png

6a14c34f99b5159aeee8a10099549551.png

数据库层:

UserDao.java

2e3a4207a412bc6c74b2d439708d460e.png

UserDaoImpl.java

8588781f673dff72603a47d89dc655f6.png

9.1.4 在regServlet中完成注册成功和注册失败的代码逻辑,然后运行项目,点击注册观察运行效果。

874563f77779c12045942b4cc98ba210.png

10注册成功提示语&项目问题引入和解决方案

10.1 编程题

10.1.1 根据视频讲解,完成注册成功提示语功

5e5b1b8546ed3f990b02a94a7a0e3949.png

b21b7b136c83eb7ee7f21f394e203350.png

10.1.2 视频中目前项目存在的问题是什么?

如何在service方法中实现根据请求动态的调用其功能处理方法呢?

使用反射。

11service中实现动态调用请求处理方法(1)

11.1 编程题

11.1.1 根据视频创建DataServlet,并声明登录,退出,注册三个方法。

a1a07d0bc557af003c53e676e0fa42a8.png

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 修改登录页面在表单中添加隐藏便签,添加请求数据中的方法名,完成登录功能

6ba3ec5f4a4015f6ee59a3ff5507b118.png

12.1.3 修改退出按钮,完成退出功

6a2af82e40df3eea60e68c79ca757d1d.png

12.1.4 修改注册页面,完成注册功能

da6772b78e0a18624be90e7c334af21c.png

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

然后启动项目重新访问相关功能。

基本功能均能实现

b78a2ef9bc3a121fb075db40d6d777fd.png

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、响应结果都是覆盖原有内容显示给用户

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值