Java MVC理解

Java MVC理解,java,jsp,model-view-controller,Java,Jsp,Model View Controller,我很难理解如何在基于java的web应用程序中使用MVC模式 我有多个表(postgreSQL 9.4),存储在那里的数据将对多个用户可见 就我的理解而言,我需要一个模型(它保存数据库表中的所有数据) 任何想要查看这些数据的用户都可以使用视图来查看这些数据 现在我有一个充满getter方法的类。每种方法都要求数据库提供特定sql表中存储的数据。然后将该数据作为json字符串返回到我的.jsp页面中,在那里我将该数据填充到一个html表中(.jsp只是保存表结构) 这是一种模型,除了数据只是从数据

我很难理解如何在基于java的web应用程序中使用MVC模式

我有多个表(postgreSQL 9.4),存储在那里的数据将对多个用户可见

就我的理解而言,我需要一个模型(它保存数据库表中的所有数据) 任何想要查看这些数据的用户都可以使用视图来查看这些数据

现在我有一个充满getter方法的类。每种方法都要求数据库提供特定sql表中存储的数据。然后将该数据作为json字符串返回到我的.jsp页面中,在那里我将该数据填充到一个html表中(.jsp只是保存表结构)

这是一种模型,除了数据只是从数据库中提取出来并交给jsp显示之外

从那时起,我如何确保所有用户对数据始终具有相同的视图,并且即使用户A更改了其他用户也在查看的数据,数据也始终是最新的

由于我有多个db表,我是否需要每个表都有一个模型

编辑: 我处理这个问题的方法如下

  • 每个数据库表都有一个类(模型)
  • 在应用程序启动时,我从SQL表中提取数据并将其存储在特定类中
  • 如果任何用户想要查看数据,我在每个模型类中都有一个getter方法来将数据发送到.jsp页面进行显示
  • 如果任何用户对数据库(setter方法)进行了更改,则会(在执行set方法之后)再次提取数据,以便模型是最新的
  • 然后我需要在.jsp页面上更新任何用户查看的数据
这与MVC模式的发展方向相同吗

编辑1:

一个例子

我的一个SQL表如下所示

CREATE TABLE users
(
  id serial NOT NULL,
  user character varying(50) NOT NULL,
  CONSTRAINT users_pkey PRIMARY KEY (id)
)
我的模型类如下所示:

public class Users extends HttpServlet implements Servlet{
    private List<List<String>> users = new ArrayList<List<String>>();

    private void load_userData(){
        // Code to pull data from database
        /**/

        List<List<String>> users = new ArrayList<List<String>>(2);
        // instantiate array list
        users.add(new ArrayList<String>());
        users.add(new ArrayList<String>());

        try {
            m_ResultSet = database_connection.execute_querry_on_db(query);
            while (m_ResultSet.next()) {
                users.get(0).add(m_ResultSet.getString("id"));
                users.get(1).add(m_ResultSet.getString("user"));
            }
        } catch (SQLException ex) {
            Logger.getLogger(Login.class.getName()).log(Level.SEVERE, null, ex);
        }
        // store pulled data into model
        this.users = users ;
    }

    private List<List<String>> get_userData(){
        // Code to pull data from Model
        return users;
    }

    private void set_userData(){
        // make changes to SQL table with an update/insert query

        // Update Model with new data since it has been altered
        get_userData();
    }


    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
        String requested_values = request.getParameter("type");

        if("get_users".equals(requested_values)){
            String json_users = new Gson().toJson(get_userData());

            // write JSON string to response
            response.getWriter().write(json_users);
        }
    }

}
剩下的就是在前端的所有会话中始终更新数据。

因此,我的应用程序的每个用户都需要看到相同的数据。在这里,我需要一个侦听器,当另一个用户更改数据库时刷新.jsp页面。我该怎么做

编辑: 我找到了一些使用时间间隔检查新数据的解决方案,但这仍然给我留下了一个问题,即根据计时器间隔的长度存在数据不匹配的问题&例如,将间隔设置为1ms可能不是最佳解决方案,我猜(必须有一种“更平滑”的方法来做到这一点)


我宁愿让应用程序在有新数据可用时立即用新数据更新.jsp页面&即使这样,我也会面临竞争条件,即用户在点击按钮时会更快,比如说删除用户(一个会成功,一个会失败)

在我看来,模型和视图之间的通信不使用
控制器。所以它不是真正的MVC

没有必要为每个表都提供一个模型,但建议这样做

这个想法本身似乎是可靠的

更具体地说: 我经常看到并使用以下结构:控制器、服务和模型。模型保存数据,而服务负责在用户发送请求后提取数据。该请求通过控制器处理,控制器通知相应的服务提取数据,并向视图提供必要的模型

我发现的一个简短示例(Hibernate/SpringMVC)

UserController(管理所有传入请求并与UserService通信):

@RequestMapping(value=“user/{id}”,method=RequestMethod.GET)
@应答器
公共用户get(@PathVariable Long id,Locale,Model Model)抛出NotFoundException{
用户u=userService.find(id);
如果(u!=null)
返回u;
其他的
抛出new NotFoundException(“未找到用户”);
}
@RequestMapping(value=“user”,method=RequestMethod.GET)
@应答器
公共列表(区域设置、模型){
List l=userService.List();
返回l;
}
UserService(负责为控制器提供正确的数据):

公共用户查找(长键){
//数据库访问
return(User)sessionFactory.getCurrentSession().get(User.class,key);
}
公开名单(){
//再次查询数据库中的列表,但不查询单个用户
//DAO只是特定于hibernate的东西
返回userDAO.list();
}

最后还有一个类
User
,用于与接口通信(并包含所有必要的属性)——在本例中,它用于通过REST/JSON进行传递。

为了确保JSP页面始终显示最新数据,必须使用javascript或ajax刷新页面

我不会在启动时提取数据。你应该在需要的时候拉它。无论哪种方法都可以,因为有很多数据我希望在启动时就可以使用。这样,当请求数据时,可以减少数据提取。没有C的MVC,听起来很有趣。^^我用我刚刚制作的模型的代码更新了我的问题。这应该适用于我的案例,但仍然缺少一些东西来更新我的应用程序用户正在查看的前端页面<也许这可以帮助您解决问题。此外,它是一个有点糟糕的设计,你在你的模型。如果您想要MVC,您应该在控制器类中移动
doGet()
。)请看一看您链接的另一个问题。我现在把模型和控制器结合起来了?这样一个控制器类是什么样子的,你能举个例子吗?基本上,控制器包含处理从视图中得到的所有请求(例如,你可以调用你的控制器
UserController
,你可能有另一个控制器用于不同的视图/模型等等)。我对使用Hibernate和SpringMVC有点着迷,所以我很难想出任何例子;)使用Spring/Hibernat的示例
public class User_Controller extends HttpServlet implements Servlet{
    private User_data model;


    public OE_Controller(User_data model){
        this.model = model;
   }

    private List<List<String>> get_userData(){
        return model.users;
    }

    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
        String requested_values = request.getParameter("type");

        if("get_users".equals(requested_values)){
            String json_users = new Gson().toJson(get_userData());

            // write JSON string to response
            response.getWriter().write(json_users);
        }
    }

}
public class Users{
    private List<List<String>> users = new ArrayList<List<String>>();

    public List<List<String>> get_users(){
        return users;
    }

    // Fill model with data from database
    public void pull_UserData(){
        /**/
        List<List<String>> users = new ArrayList<List<String>>(2);
        // instantiate array list
        users.add(new ArrayList<String>());
        users.add(new ArrayList<String>());

        try {
            m_ResultSet = database_connection.execute_querry_on_db(query);
            while (m_ResultSet.next()) {
                users.get(0).add(m_ResultSet.getString("id"));
                users.get(1).add(m_ResultSet.getString("user"));
            }
        } catch (SQLException ex) {
            Logger.getLogger(Login.class.getName()).log(Level.SEVERE, null, ex);
        }
        /**/
        this.users = users;
    }
}
public class User_Controller extends HttpServlet implements Servlet{
    private Users model;


    public User_Controller(Users model){
        this.model = model;
    }

    public List<List<String>> get_users(){
        return model.get_users();
    }

    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
        String requested_values = request.getParameter("type");

        if("get_users".equals(requested_values)){
            String json_users = new Gson().toJson(get_users());

            // write JSON string to response
            response.getWriter().write(json_users);
        }
    }
}
// create Model
Users model = pull_UserData();

// create Controller
User_Controller controller = new User_Controller(model);

// get Model data
controller.get_oes();
// Even though I will never access Model data from here since
// my Controller will hand out the data via the do_Get() method
// "Main" is just to load the model data once on application startup
// and the model data reload is done after a setter method is executed

public static Users fill_model_Users_data(){
    Users users = new Users();
    users.pull_UserData();
    return users;
}
@RequestMapping(value = "user/{id}", method = RequestMethod.GET)
@ResponseBody
public User get(@PathVariable Long id, Locale locale, Model model) throws NotFoundException {   
    User u = userService.find(id);
    if (u != null)
        return u;
    else
        throw new NotFoundException("user not found");
}

@RequestMapping(value = "user", method = RequestMethod.GET)
@ResponseBody
public List<User> list(Locale locale, Model model) {
    List<User> l = userService.list();  
    return l;
}
public User find(Long key) {
    // access on database 
    return (User) sessionFactory.getCurrentSession().get(User.class, key);
}

public List<User> list() {
    // again query the database for a list but not for a single user
    // the DAO is just something hibernate specific
    return userDAO.list();
}