Java web 开发 第7章 MVC模式

目录

MVC介绍

JSP中的MVC模式

模型的生命周期与视图更新

request bean

session bean

application bean


MVC介绍

MVC是一种软件架构模式,它将应用程序分为三个主要组件:模型、视图和控制器。其中,模型用于管理应用程序的数据和业务逻辑,视图负责呈现数据给用户,控制器则用于协调模型和视图之间的交互。

JSP中的MVC模式

JSP(JavaServer Pages)是一种基于Java的Web开发技术,可以用于动态生成HTML页面。在JSP中,也可以使用MVC(Model-View-Controller)模式来组织代码,以实现更好的可维护性和可扩展性。

在JSP中,通常将模型(Model)、视图(View)和控制器(Controller)分别实现为JavaBean、JSP页面和Servlet。具体地说:

1. 模型(Model)
JavaBean用于封装业务数据和逻辑,例如:

public class User {
    private int id;
    private String name;
    private String email;
    // getters and setters
}

2. 视图(View)
JSP页面用于呈现数据给用户,例如:

<html>
<body>
    <h2>Welcome, ${user.name}!</h2>
    <p>Your email address is ${user.email}</p>
</body>
</html>

3. 控制器(Controller)
Servlet用于协调模型和视图之间的交互,例如:

@WebServlet("/user")
public class UserController extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        User user = new User();
        user.setId(1);
        user.setName("John");
        user.setEmail("john@example.com");
        request.setAttribute("user", user);
        request.getRequestDispatcher("user.jsp").forward(request, response);
    }
}

在上面的代码中,Servlet创建了一个User对象,并将其设置为请求属性。然后,它将请求转发到user.jsp页面,以呈现用户数据。

模型的生命周期与视图更新

request bean

Request Bean是一种JavaBean,用于封装HTTP请求中的参数。它通常用于在JSP页面和Servlet之间传递数据,以及在JSP页面中使用EL表达式访问请求参数。

以下是一个简单的Request Bean示例:

public class UserRequest {
    private String name;
    private String email;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}

在上面的代码中,我们定义了一个UserRequest类,它有两个属性:name和email。它们分别对应HTTP请求中的name和email参数。

在JSP页面中,我们可以使用<jsp:useBean>标签来创建一个Request Bean对象,并使用<jsp:setProperty>标签来设置其属性值。例如:

<jsp:useBean id="userRequest" class="com.example.UserRequest" />
<jsp:setProperty name="userRequest" property="name" value="${param.name}" />
<jsp:setProperty name="userRequest" property="email" value="${param.email}" />

在上面的代码中,我们首先使用<jsp:useBean>标签创建一个名为userRequest的Request Bean对象。然后,我们使用<jsp:setProperty>标签设置它的name和email属性,这些属性的值分别来自HTTP请求中的name和email参数。

在Servlet中,我们可以使用HttpServletRequest对象来访问Request Bean。例如:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    UserRequest userRequest = new UserRequest();
    userRequest.setName(request.getParameter("name"));
    userRequest.setEmail(request.getParameter("email"));
    request.setAttribute("userRequest", userRequest);
    request.getRequestDispatcher("user.jsp").forward(request, response);
}

在上面的代码中,我们首先创建一个UserRequest对象,并使用HttpServletRequest对象设置它的name和email属性。然后,我们将它设置为请求属性,并将请求转发到user.jsp页面,以呈现用户数据。

使用Request Bean可以使JSP代码更清晰、更易于维护和扩展。它可以将请求参数封装为JavaBean,以便在JSP页面和Servlet之间传递数据,并使用EL表达式访问请求参数。

session bean

Session Bean是一种JavaBean,用于在Web应用程序中管理用户会话状态。它通常用于在多个HTTP请求之间共享数据,并在用户会话结束时自动清除数据。

Session Bean有三种类型:Stateless Session Bean、Stateful Session Bean和Singleton Session Bean。

Stateless Session Bean(无状态会话Bean)是一种不保存任何客户端状态的Bean,它处理客户端请求并返回响应。每次请求都会创建一个新的Stateless Session Bean实例,并在请求处理完成后立即销毁。它通常用于执行无状态操作,例如计算和转换。

Stateful Session Bean(有状态会话Bean)是一种保存客户端状态的Bean,它可以跨多个HTTP请求共享数据。每个客户端都有一个唯一的Stateful Session Bean实例,该实例在客户端会话期间保持活动状态,并在会话结束时销毁。它通常用于执行需要保存客户端状态的操作,例如购物车和在线游戏。

Singleton Session Bean(单例会话Bean)是一种在整个Web应用程序中共享状态的Bean,它可以跨多个HTTP请求共享数据。每个Web应用程序只有一个Singleton Session Bean实例,该实例在Web应用程序启动时创建,并在Web应用程序关闭时销毁。它通常用于执行需要共享状态的操作,例如缓存和配置。以下是一个简单的Stateful Session Bean示例:
 

@Stateful
public class ShoppingCartBean implements ShoppingCart {
    private List<Item> items = new ArrayList<>();

    public void addItem(Item item) {
        items.add(item);
    }

    public void removeItem(Item item) {
        items.remove(item);
    }

    public List<Item> getItems() {
        return items;
    }

    public void clear() {
        items.clear();
    }
}

在上面的代码中,我们定义了一个ShoppingCartBean类,它实现了一个ShoppingCart接口。它有一个私有的items属性,用于保存购物车中的物品。它还有四个公共方法:addItem()、removeItem()、getItems()和clear(),用于添加、删除、获取和清空购物车中的物品。

在Servlet中,我们可以使用HttpServletRequest对象来访问Stateful Session Bean。例如:
 

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    HttpSession session = request.getSession(true);
    ShoppingCart cart = (ShoppingCart) session.getAttribute("cart");
    if (cart == null) {
        cart = (ShoppingCart) new InitialContext().lookup("java:global/myapp/ShoppingCartBean");
        session.setAttribute("cart", cart);
    }
    String action = request.getParameter("action");
    if (action != null) {
        if (action.equals("add")) {
            String name = request.getParameter("name");
            double price = Double.parseDouble(request.getParameter("price"));
            Item item = new Item(name, price);
            cart.addItem(item);
        } else if (action.equals("remove")) {
            int index = Integer.parseInt(request.getParameter("index"));
            Item item = cart.getItems().get(index);
            cart.removeItem(item);
        } else if (action.equals("clear")) {
            cart.clear();
        }
    }
    request.getRequestDispatcher("cart.jsp").forward(request, response);
}

在上面的代码中,我们首先使用HttpServletRequest对象获取HttpSession对象,并从中获取ShoppingCart对象。如果ShoppingCart对象不存在,则使用JNDI查找Stateful Session Bean,并将其设置为HttpSession对象的属性。然后,我们根据请求参数执行相应的操作,例如添加、删除和清空购物车中的物品。最后,我们将请求转发到cart.jsp页面,以呈现购物车中的物品。

使用Stateful Session Bean可以使Web应用程序更易于管理和扩展,因为它可以跨多个HTTP请求共享数据,并在用户会话结束时自动清除数据。它还可以提高Web应用程序的性能,因为它可以避免在每个HTTP请求中重复创建和销毁对象。

application bean

Application Bean是一种JavaBean,用于在Web应用程序中共享全局数据。它通常用于存储应用程序级别的配置信息、共享资源和状态信息等。

Application Bean是一种单例Bean,它在整个Web应用程序中只有一个实例。它可以在应用程序启动时创建,并在应用程序关闭时销毁。它可以跨多个HTTP请求共享数据,并在应用程序生命周期内保持活动状态。以下是一个简单的Application Bean示例:
 

@ApplicationScoped
public class AppConfig {
    private String appName = "MyApp";
    private int maxItems = 100;

    public String getAppName() {
        return appName;
    }

    public void setAppName(String appName) {
        this.appName = appName;
    }

    public int getMaxItems() {
        return maxItems;
    }

    public void setMaxItems(int maxItems) {
        this.maxItems = maxItems;
    }

在上面的代码中,我们定义了一个AppConfig类,它有两个私有属性:appName和maxItems。它还有两个公共方法:getAppName()和getMaxItems(),用于获取属性值,以及setAppName()和setMaxItems(),用于设置属性值。

在Servlet中,我们可以使用ServletContext对象来访问Application Bean。例如:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    ServletContext context = getServletContext();
    AppConfig config = (AppConfig) context.getAttribute("config");
    if (config == null) {
        config = new AppConfig();
        context.setAttribute("config", config);
    }
    request.setAttribute("appName", config.getAppName());
    request.setAttribute("maxItems", config.getMaxItems());
    request.getRequestDispatcher("index.jsp").forward(request, response);
}

在上面的代码中,我们首先使用getServletContext()方法获取ServletContext对象,并从中获取AppConfig对象。如果AppConfig对象不存在,则创建一个新的AppConfig对象,并将其设置为ServletContext对象的属性。然后,我们将appName和maxItems属性的值设置为request对象的属性,并将请求转发到index.jsp页面,以呈现应用程序的配置信息。

使用Application Bean可以使Web应用程序更易于管理和扩展,因为它可以跨多个HTTP请求共享数据,并在应用程序生命周期内保持活动状态。它还可以提高Web应用程序的性能,因为它可以避免在每个HTTP请求中重复创建和销毁对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值