本文は MVC 開発における JSP 開発で遭遇したいくつかの一般的な問題をまとめたものです。
本文は MVC 開発における JSP 開発で遭遇したいくつかの一般的な問題をまとめたものです。
変数宣言#
必ず先に宣言してから使用し、未宣言の変数を使用することは許可されていません。
正しい
var myVar = 3
~ 間違い~
myVar = 3 //IE8以下では保存され、高度なブラウザではグローバル変数が生成され、ロジックに影響を与えます
JSON#
JSON は何か#
JSON(JavaScript Object Notation)は、JavaScript オブジェクト表記法です。
JSON は、テキスト情報を保存および交換するための構文で、XML に似ています。
JSON は XML よりも小さく、速く、解析が容易です。
JSON 構造とは?#
JSON は簡単に言うと、JavaScript のオブジェクトと配列であり、これらの 2 つの構造を使用してさまざまな複雑な構造を表現できます。
オブジェクト:オブジェクトは JS で「{}」で囲まれた内容として表され、データ構造は {key:value,key:value,…} のキーと値のペアの構造です。
配列:配列は JS で「[]」で囲まれた内容として表され、データ構造は [“java”,”javascript”,”vb”,…] です。
オブジェクトと配列の 2 つの構造を組み合わせることで、複雑なデータ構造を作成できます。
PS:このウェブサイトは JSON の一般的な問題を処理し、検証、フォーマット、エスケープ解除などを行うことができます。
SoJSON
フロントエンドで JSON を操作するには?#
JSON オブジェクト -> JSON 文字列(例えば、リクエストを開始する前に JS オブジェクトを転送可能な文字列に変換する場合)
JSON文字列 -> JSONオブジェクト(例えば、サーバーからの戻り値を受け取り、ブラウザ側で解析する準備をする場合)
``` jObj = JSON.parse(jStr);
バックエンドで JSON を操作するには?#
パッケージ依存:org.json.JSONArray、org.json.JSONObject を使用して JSON オブジェクトを直接構築します。
JSONArray jArr = new JSONArray(); // 簡単なJSON配列
jArr.put(“小明”);
jArr.put(“小強”);
JSONObject jObj = new JSONObject();// 簡単なJSONオブジェクト
jObj.put(“age”, 12);
jObj.put(“xb”, “男”);
jObj.put(“xb”, jArr); // ネストして使用
JSON文字列 -> JSONオブジェクト
JSONArray jArr = new JSONArray(jArrStr);
JSONObject jObj = new JSONObject(jObjStr);
JSONオブジェクト -> JSON文字列
String jArrStr = jArr.toString();
String jObjStr= jArr.toString();
同期方法と非同期方法#
同期方法#
同期方法は、メソッドが完了した後に戻り、次のメソッドを実行します。
非同期方法#
非同期方法は即座に戻り、次のメソッドを実行します。このメソッドの実行に必要な時間とは無関係で、コールバック関数を通じてこのメソッドが完了したかどうかを知ることができます。
![][img-1]
例#
正しい方法
function SaveGrid() { //ここでsaveDataは非同期メソッド
saveData("demo.do?method=addRowData", synchFillGrid);
}
function synchFillGrid() {
synchFillData("demo.do?method=refreshMyTags", "grid:vdsdw");
}
間違った使用法 1:コールバック関数を渡そうとしましたが、呼び出しました
function SaveGrid() { //ここでsaveDataは非同期メソッド
saveData("demo.do?method=addRowData",synchFillGrid());
}
間違った使用法 2:非同期メソッドのコールバック関数内で後続の操作を行っていません;
function SaveGrid() { //ここでsaveDataは非同期メソッド
saveData("demo.do?method=addRowData");//asynchFillDataを実行する時、saveDataメソッドはまだ実行が完了していません!
asynchFillData("demo.do?method=refreshMyTags", "grid:vdsdw");
}
間違った使用法 3:同期 JS 呼び出しの方法で戻り値を受け取ります;
function SaveGrid() { // 非同期メソッドの戻り値は、同期方式で受け取ることはできません
var result = AjaxUtil.asynchAjaxRequest("demo.do?method=addRowData");
if(!AjaxUtil.checkException(result)){
AjaxUtil.showException(result); return false
}
}
フレームワーク内で画像を表示するには#
JSP
<%@ page contentType="text/html;charset=GBK"language="java"%>
<%@ taglib uri="darewayBS.tld" prefix="dw"%>
<%@ page
import="com.dareway.framework.util.StringUtil" %>
<%
String uuid = (String)StringUtil.getUUID();
%>
<dw:body>
<dw:diy>
<img id="img<%=uuid%>"/>
</dw:diy>
</dw:body><script type="text/javascript" defer="defer"> getImg();
</script><script type="text/javascript">
function getImg(){
$("#img<%=uuid%>")[0].src = GlobalNames.compileUR("demo.do?method=getImg");
}</script>
Controller
public ModelAndView getImg(HttpServletRequest request, HttpServletResponse response, DataObject para) throws Exception {
byte[] bytes = null;
FileInputStream fis = null;
ByteArrayOutputStream baos = null;
try { // 1. 画像のバイトストリーム配列を取得します(この例では直接読み取ったファイル;実際にはデータベースや他の方法から取得できます;)
fis = new FileInputStream("F:/威海結算章.png");
baos = new ByteArrayOutputStream();
int i = 0;
byte[] buffer = new byte[2048];
while ((i = fis.read(buffer)) != -1) {
baos.write(buffer, 0, i);
}
baos.flush();
bytes = baos.toByteArray();
// 画像をブラウザに書き込みます
response.setContentType("image/png");
response.getOutputStream().write(bytes);
} catch (Exception e) {
e.printStackTrace();
} finally {
if(fis != null){
fis.close();
}
if(baos != null){
baos.close();
}
}
return null;
}