0420、0421课堂学习MVC模式,转发,重定向与JavaBean
JavaBean
JavaBean 是 Java语言编写类的一种标准规范。符合 JavaBean 的类,要求类必须是具体的和公共的,并且具有无参数的构造方法,提供用来操作成员变量的 set 和 get 方法。
语法格式:
public class ClassName{
//成员变量
//构造方法
//无参构造方法【必须】
//有参构造方法【建议】
//成员方法
//getXxx()
//setXxx()
}
编写符合 JavaBean 规范的类,以学生类为例,标准代码如下:
public class Student {
//成员变量
private String name;
private int age;
//构造方法
public Student() {}
public Student(String name,int age) {
this.name = name;
this.age = age;
}
//成员方法
publicvoid setName(String name)
{
this.name = name;
}
public String getName() {
return name;
}
publicvoid setAge(int age) {
this.age = age;
}
publicint getAge() {
return age;
}
重定向
资源跳转的方式
代码实现:
//简单的重定向方法
response.sendRedirect("路径");
重定向的特点:redirect
- 地址栏发生变化
- 重定向可以访问其他站点(服务器)的资源
- 重定向是两次请求。不能使用request对象来共享数据
转发
资源跳转的方式
代码实现:
req.getRequestDispatcher("路径").forward(req,resp);
转发的特点:forword
- 转发地址栏路径不变
- 转发只能访问当前服务器下的资源
ServletContext对象: - 转发是一次请求,可以使用request对象来共享数据
注意:重定向跟转发从两者的特点上就能看出两者的区别
MVC开发模式
- jsp演变历史
- 早期只有servlet,只能使用response输出标签数据,非常麻烦
- 后来又jsp,简化了Servlet的开发,如果过度使用jsp,在jsp中即写大量的java代码,又写html表,造成难于维护,难于分工协作
- 再后来,java的web开发,借鉴mvc开发模式,使得程序的设计更加合理性
- MVC:
- M:Model,模型。JavaBean用来封装业务数据,模型
- 完成具体的业务操作,如:查询数据库,封装对象
- V:View,视图。JSP实现数据的显示
- 展示数据
- C:Controller,控制器。Servlet
- 获取用户的输入
- 调用模型
- 将数据交给视图进行展示
- 优缺点:
(1)优点:
耦合性低,方便维护,可以利于分工协作,提高开发效率
(2)缺点:
使得项目架构变得复杂,对开发人员要求高
- M:Model,模型。JavaBean用来封装业务数据,模型
访问WEB-INF下jsp页面
jsp页面放在WEB-INF下的原因主要是考虑安全性,客户端用户不能通过地址栏直接访问该WEB-INF目录下的jsp页面
- 方法: 通过服务器转发 跳转到WEB-INF下的jsp页面
课堂案例(登录验证跳转到主页面或错误页面)
1、实现转发、重定向
在LoginController.java中重写doGet方法,使用req.getRequestDispatcher(“目标路径”).forword(req,resp);进行转发
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.getRequestDispatcher("/WEB-INF/template/login.jsp").forward(req,resp);//使用req转发,跳转到login页面
}
重写doPost方法,使用response对象重定向到指定页面
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String loginName = req.getParameter("loginName");
String loginPwd = req.getParameter("loginPwd");
String validCode = req.getParameter("validCode");
resp.setCharacterEncoding("utf-8");
String msg = (String)req.getAttribute("msg");
String saveCode = (String)req.getSession().getAttribute("code");//获取session内的code值强制转换成String类型
//如果用户名是你的学号,密码是1234 那么显示你好,登录名称,如果不对,那么显示账号或密码错误
String str = null;
if(saveCode != null){ //如果验证码不为空
if(saveCode.equals(validCode)){ //判断session内的code值与用户输入的验证码是否相同
UserService service = new UserService();
User user = service.login(loginName,loginPwd);
if(user != null){
req.getSession().setAttribute("user",user);//用户信息保存到session中
resp.sendRedirect("./main");//重定向到主页面
}else {
loginFail(req,resp,"账号或密码错误");
}
}else{
loginFail(req,resp,"验证码错误");
}
}else {
loginFail(req,resp,"请输入验证码");
}
}
2、login.jsp使用表单创建登录界面
<form action='./login' name='submit' method='post'>
登录名称:<input type='text' name='loginName'/><br>
登录密码:<input type='password' name='loginPwd'/><br>
验 证 码:<input type='text' name='validCode'><img src='./Captche' width=120 height=80 /><br>
<input type='submit' name='btnLogin'value='登录'/><input type="reset" value="取消"><br>
</form>
3、User实体类
public class User {
private Integer id;
private String name;
private String pwd;
private String nickname;
private Date birthday;
public User(){ //无参构造
}
public User(Integer id){ //构造方法
this.id=id;
}
public User(Integer id, String name, String pwd, String nickname, Date birthday) {
this.id = id;
this.name = name;
this.pwd = pwd;
this.nickname = nickname;
this.birthday = birthday;
}
//这里省略getter和setter方法
4、UserService类
/**
* 功能描述:判断登录是否成功
* 如果成功需要保存用户信息
* @author xuyou
* @date 2020/04/21 8:55
*/
public class UserService {
public User login(String loginName, String pwd){
//通过loginName条件到数据库中查询此用户信息
User saveUser = new User(1,"101","1234","昵称",null);
if(saveUser != null && saveUser.getName().equals(loginName) && saveUser.getPwd().equals(pwd)){
return saveUser;
}else{
return null;
}
}
}
MainController.java
MainController.java,重写doGet方法转发到main.jsp页面去
@WebServlet("/main")
public class MainController extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req,HttpServletResponse resp) throws ServletException, IOException {
//准备主界面中的数据,放置到req对象里面
req.getRequestDispatcher("/WEB-INF/template/main.jsp").forward(req,resp);
}
}
附上主页面及错误页面简要代码
- fail.jsp错误页面,显示错误数原因
登录失败,原因:<%=request.getAttribute("msg")%> 请重新<a href="login">登录</a>
在loginController.java中需要添加如下代码,用来实现登录验证失败时跳转到fail页面
private void loginFail(HttpServletRequest req,HttpServletResponse resp,String str)throws ServletException, IOException{
req.setAttribute("msg",str);
req.getRequestDispatcher("/WEB-INF/template/fail.jsp").forward(req,resp);//跳转到fail页面
}
如果不想要跳转到fail页面,则使用:
private void loginFail(HttpServletRequest req,HttpServletResponse resp,String str)throws ServletException, IOException{
resp.sendRedirect("/login?err="+ URLEncoder.encode(str,"utf-8"));
}
此时要将错误信息显示在登录页面,在login.jsp中加入代码:
<%@ page import="java.net.URLDecoder" %>
<%
String err = request.getParameter("err");
if(err != null) {
err = URLDecoder.decode(err, "utf-8");
%>
<%=err%>
<%
}
%>
- main.jsp登录成功跳转的主页面
这是主界面,欢迎:<%=((User)session.getAttribute("user")).getNickname()%>