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

  1. 地址栏发生变化
  2. 重定向可以访问其他站点(服务器)的资源
  3. 重定向是两次请求。不能使用request对象来共享数据

转发

资源跳转的方式

代码实现:

req.getRequestDispatcher("路径").forward(req,resp);

转发的特点:forword

  1. 转发地址栏路径不变
  2. 转发只能访问当前服务器下的资源
    ServletContext对象:
  3. 转发是一次请求,可以使用request对象来共享数据

注意:重定向跟转发从两者的特点上就能看出两者的区别

MVC开发模式

  1. jsp演变历史
    1. 早期只有servlet,只能使用response输出标签数据,非常麻烦
    2. 后来又jsp,简化了Servlet的开发,如果过度使用jsp,在jsp中即写大量的java代码,又写html表,造成难于维护,难于分工协作
    3. 再后来,java的web开发,借鉴mvc开发模式,使得程序的设计更加合理性
  2. MVC:
    1. M:Model,模型。JavaBean用来封装业务数据,模型
      • 完成具体的业务操作,如:查询数据库,封装对象
    2. V:View,视图。JSP实现数据的显示
      • 展示数据
    3. C:Controller,控制器。Servlet
      • 获取用户的输入
      • 调用模型
      • 将数据交给视图进行展示
    4. 优缺点:
      (1)优点:
      耦合性低,方便维护,可以利于分工协作,提高开发效率
      (2)缺点:
      使得项目架构变得复杂,对开发人员要求高

访问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()%>

运行结果

在这里插入图片描述

在这里插入图片描述在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
图像识别技术在病虫害检测中的应用是一个快速发展的领域,它结合了计算机视觉和机器学习算法来自动识别和分类植物上的病虫害。以下是这一技术的一些关键步骤和组成部分: 1. **数据收集**:首先需要收集大量的植物图像数据,这些数据包括健康植物的图像以及受不同病虫害影响的植物图像。 2. **图像预处理**:对收集到的图像进行处理,以提高后续分析的准确性。这可能包括调整亮度、对比度、去噪、裁剪、缩放等。 3. **特征提取**:从图像中提取有助于识别病虫害的特征。这些特征可能包括颜色、纹理、形状、边缘等。 4. **模型训练**:使用机器学习算法(如支持向量机、随机森林、卷积神经网络等)来训练模型。训练过程中,算法会学习如何根据提取的特征来识别不同的病虫害。 5. **模型验证和测试**:在独立的测试集上验证模型的性能,以确保其准确性和泛化能力。 6. **部署和应用**:将训练好的模型部署到实际的病虫害检测系统中,可以是移动应用、网页服务或集成到智能农业设备中。 7. **实时监测**:在实际应用中,系统可以实时接收植物图像,并快速给出病虫害的检测结果。 8. **持续学习**:随着时间的推移,系统可以不断学习新的病虫害样本,以提高其识别能力。 9. **用户界面**:为了方便用户使用,通常会有一个用户友好的界面,显示检测结果,并提供进一步的指导或建议。 这项技术的优势在于它可以快速、准确地识别出病虫害,甚至在早期阶段就能发现问题,从而及时采取措施。此外,它还可以减少对化学农药的依赖,支持可持续农业发展。随着技术的不断进步,图像识别在病虫害检测中的应用将越来越广泛。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值