0

こんばんは。アプリケーションにコントローラーがあります:

        @Controller
        public class LoginSearchController {

            //List to store data from resultHTML method
            List<Cars> listCars = null;


            @Autowired
            private EducationWebServiceInterface educationWebService;

                //This method render jsp page for user and create model for resultHTML
                @RequestMapping(value="/search", method=RequestMethod.GET)
                public String search(FormBackingObjectSearch fbos, Model model) {   
                        model.addAttribute("fbosAttributes", fbos);

                    return "search";        
                }   

               //   This method get name form form back object and use it for fetchCarsByNameService method
              // After if something found it stores it in listofSerchObjects and after listofSerchObjects stores it in listForm List
                @RequestMapping(value="/result", method=RequestMethod.GET)
                public String resultHTML(@RequestParam String name,
                                         @ModelAttribute("fbosAttributes") FormBackingObjectSearch fbos, 
                                         BindingResult bindingResut, Model model) throws Exception {


                    listCars = new ArrayList<Cars>();
                    List<Cars> listofSerchObjects = null;

                    listofSerchObjects = educationWebService.fetchCarsByNameService(dateConvertation(fbos.getName()));
                        model.addAttribute("findAttributes", listofSerchObjects);   
                        listCars.addAll(listofSerchObjects);

                    return "search";
                }


                  //This method fetch data from listForm to make Excel document form the list
                @RequestMapping(value="/result.xls", method=RequestMethod.GET)
                public String resultXLS(Model model) throws Exception {

                        if(listCars == null || listCars.size() == 0) {
                            throw new NullPointerException("ArrayList<FormDate> formDateList is empty list");
                        } else {            
                            model.addAttribute("findAttributesXls", listForm);
                        }               
                    return "xlspage";
                }
        }

コントローラーで何が起こるか:

ユーザーは、Search検索したい車の名前を入力するページに移動し(私の場合)、ボタンをクリックした後FIND

--> リクエストは に送信され/resultます。この メソッドは、サービス レイヤーからresultHTML呼び出して、特定の名前に対応するデータを取得し、それを jsp ページにレンダリングします。それからデータを取得すると、すべてのデータが他のリストに追加されます。fetchCarsByNameServicelistofSerchObjectslistofSerchObjectsfetchCarsByNameServicelistCars

--> 次のステップでは、jsp ページにすべてのデータがレンダリングされると、ボタンが表示されますSAVE AS EXCEL。何が起こるか: ユーザーがこのボタンをクリックすると (ユーザーが望む場合)、[ /result.xls AND TAKE ALL THE DATA FROM listCars ] に進み、Excel ファイルに保存されます。

Web アプリケーションで複数のユーザーが同じ jsp ページから異なるコンピューターで作業する場合、 どのようlistCarsに動作するか非常に興味があります。データベースから抽出された最後のデータが保存されるのが怖いです.user1がそれをExcelファイルにレンダリングしたい場合、user2が最後に検索を行う場合、user2からのデータを取得します。あなたが思うこと???アドバイスお願いします。ありがとうございました

4

4 に答える 4

2

listCarsConcurrentModificationException破損しており、散発的にスローすることさえあります。

以下は、この問題の回避策です。

  1. ローカルlistCars変数を作成します。

    また

  2. で注釈Controllerを付ける@Scope("session")

これは、の長所と短所を説明する優れたブログです。ScopeController

于 2013-08-07T22:26:37.527 に答える
2

クラスlistCarsレベルの変数にしたため、インスタンスはすべてのユーザー間で共有されます。すべてのユーザー (およびリクエスト) は独自のスレッドを取得するため、そのクラス レベルの変数はすべてのユーザー間で共有され、リクエストの受信速度によってはデータが破損する可能性があります。

于 2013-08-07T16:47:25.420 に答える
1

A@Controllerは Spring Bean であり、コンテナーによって 1 回だけインスタンス化されます。スタック上の特定のリクエストに関連するすべての変数を保持します (メソッド内で宣言されます)。

于 2013-08-07T16:48:43.390 に答える
0

listCars は、アプリケーションのすべてのユーザー間で共有されます。

/result と /result.xls の 2 つの呼び出しは、互いに完全に独立しています。車のリストを再度検索するか、listCars をこのメソッドにパラメーターとして渡す必要があります。また、listCars をユーザーのセッションに保存し、result.xls の呼び出し中に取得することもできますが、これは決して使用されない可能性のある不要なデータでセッションを汚染します。

listCars の大きさと fetchCarsByNameService のコストに応じて、リストをパラメーターとして戻すか、同じパラメーターを /result として渡してメソッドを再実行するかを決定する必要があります。操作が高価な場合は、おそらくメソッドを再実行し、fetchCarsByNameService に何らかのキャッシュを設定することに傾倒します。

于 2013-08-07T17:44:27.937 に答える