Java的MVC模型是什么?
MVC模型是什么?
MVC模型是一种将Web服务器内的程序按照M(模型)、V(视图)、C(控制器)的角色进行分割的设计方法。
– 模型:负责应用程序中的数据存储和业务处理等处理逻辑,类似于系统的主体部分。模型不能执行输入输出和显示等处理。
– 视图:负责显示处理和输入输出处理等界面显示的部分。
– 控制器:负责应用程序的执行控制。它自己不执行显示或逻辑处理,而是根据输入请求,委托模型执行所需的逻辑,并将结果委托给视图进行显示。
作为开发者,系统被分为“M”、“V”、“C”三个部分,这样开发工作效率更高,各部分独立性强,减少了与其他组件的交互,降低了依赖性。
在Java中,模型被Java类(如Bean和Dao)代表,视图由JSP负责,控制器由Servlet负责。
MVC的处理流程
示例代码
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title>登録画面</title>
</head>
<body>
<h1>登録情報を入力してください</h1>
<form action="/javaweb/register4" method="post">
名前:<input type="text" name="name" size="10" /><br/>
年齢:<input type="radio" name="age" value="child" />18歳未満
<input type="radio" name="age" value="adult" />18歳以上<br/>
開発経験:<input type="checkbox" name="lang" value="Java" />Java
<input type="checkbox" name="lang" value="Python" />Python
<input type="checkbox" name="lang" value="JavaScript" />JavaScript<br/><br/>
<input type="submit" value="送信" />
</form>
</body>
</html>
这个Web浏览器会将通过输入表单和复选框获取的信息“name = ‘菅原’,age = adult,lang = Java,Lang = Python”作为请求发送到服务器。
目标地址是服务器。
import bean.RegisterBean;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
@WebServlet("/register4")
public class RegisterServlet4 extends HttpServlet {
public void doPost(HttpServletRequest req, HttpServletResponse res)
throws IOException, ServletException {
// リクエストの文字コードを指定
req.setCharacterEncoding("utf-8");
// 入力情報の取得
String name = req.getParameter("name");
String age = req.getParameter("age");
String[] langs = req.getParameterValues("lang");
res.setContentType("text/html;charset=utf-8");
// JSPでも扱える様にBeanのオブジェクト作成
RegisterBean rb = new RegisterBean();
rb.setName(name);
rb.setAge(age);
rb.setLangs(langs);
// Beanをリクエストに格納
req.setAttribute("rb", rb);
// register4.jspへフォワード
RequestDispatcher rd = req.getRequestDispatcher("/register4.jsp");
rd.forward(req, res);
}
public void doGet(HttpServletRequest req, HttpServletResponse res)
throws IOException, ServletException {
doPost(req, res);
}
}
从Web浏览器发送请求后,会执行Servlet内的doPost方法。该方法调用了setter方法,将从浏览器发送的信息“name = ‘菅原’,age = adult,lang = Java,Lang = Python”存储在Bean对象中。
在方法内部,RegisterBean类将成为下面Bean类的类。
package bean;
import java.io.Serializable;
public class RegisterBean implements Serializable{
private String name;
private String age;
private String[] langs;
public RegisterBean(){
}
public void setName(String name){
this.name = name;
}
public void setAge(String age){
this.age = age;
}
public void setLangs(String[] langs){
this.langs = langs;
}
public String getName(){
return name;
}
public String getAge(){
return age;
}
public String[] getLangs(){
return langs;
}
public String getJpnAge(){
String jpnAge;
if(age.equals("child")){
jpnAge = "18歳未満";
} else {
jpnAge = "18以上";
}
return jpnAge;
}
public String getStrLangs(){
String strLangs = "";
for(int i = 0; i < langs.length; i++){
strLangs = strLangs + langs[i] + " ";
}
return strLangs;
}
}
将传递给Controller的值,使用”setAttribute方法”存储到请求中,并使用”forward(req, res)”方法将其转发到JSP页面。转发目标通过参数”/register4.jsp”进行指定,该参数被传递给”req.getRequestDispatcher”方法。
<%@page contentType="text/html;charset=utf-8" %>
<jsp:useBean id="rb" scope="request" class="bean.RegisterBean" />
<html>
<head>
<title>確認画面</title>
</head>
<body>
<h2>入力情報を確認して登録ボタンを押してください</h2>
氏名:<strong><jsp:getProperty name="rb" property="name" /></strong><br/>
年齢:<strong><%= rb.getJpnAge() %></strong><br/>
開発経験:<strong><%= rb.getStrLangs() %></strong><br/><br/>
<input type="submit" value="登録" />
<input type="reset" value="戻る" />
</body>
</html>
参考文献