snsのservletなのですが、プログラム的には、新規登録でuserIdとパスワードを設定するときに、userIdがデータベースにない場合は、createメソッドによりaccountを作れて、その後、ログインしたあとに、そのaccountからすべてのツイート履歴が見れて、新しいコメントは、insertされるというコードを作りたいです。
データベースに保存するようにして、Main.javaを作ったのですが、コンパイルエラーが出ます。
米 の印が付いているところがコンパイルエラーの出ているところです。
⚫️これがファイル名です。
データベースはh2databaseでeclipseを使っています
⚫️Main.java
package servlet; //色のついた部分が変更箇所
import java.io.IOException;
import java.util.List;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import model.Account;
import model.Login;
import model.LoginLogic;
import model.Mutter;
import model.User;
@WebServlet("/Main")
public class Main extends HttpServlet{
private static final long serialVersionUID=1L;
protected void doPost(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException{
//なぜエラーが出るか?Loginに値がないから?値を入れるには、リクエストスコープとかパラメータから取得しなくちゃいけないの? //つぶやきリスト取得して、リクエストスコープに保存 LoginLogic loginLogic=new LoginLogic(); //Accountももはや普通の意味のAccountではない、なぜなら、loginがuserIdとtextでできていて、その情報からselectして得た情報をAccountに代入しているから
米login米 Account account = loginLogic.execute(login);
request.setAttribute("Account", account); //ログインしているか確認するため //セッションスコープからUser情報を取得 HttpSession session=request.getSession(); User userId=(User)session.getAttribute("userId"); if(userId==null){//ログインしていない //リダイレクト response.sendRedirect("/newsns/"); }else{//ログイン済み //フォワード RequestDispatcher dispatcher =request.getRequestDispatcher("/WEB-INF/jsp/main.jsp"); dispatcher.forward(request, response); } //リクエストパラメータの取得 request.setCharacterEncoding("UTF-8"); String text =request.getParameter("text"); //入力値チェック if(text !=null && text.length()!=0){ //セッションスコープに保存されたUser情報を取得
//これはさっきと同じだからコメントアウト HttpSession session=request.getSession();
米account米 Account account=(Account)session.getAttribute("userId");
//つぶやきをつぶやきリストに追加(コードを開いてくとcreateでh2databaseに保存している。 //つぶやきをつぶやきリストに追加 Login login=new Login(account.getUserId(),text); loginLogic.execute(login); //この中(executeメソッドの中にinsertが入っている。) //つぶやきリストを取得して、リクエストスコープに保存
//これもあるからとりあえずコメントアウト LoginLogic loginLogic =new LoginLogic();
//とりあえずAccount.javaとMutter.java全く引数同じになっちゃってる
米LoginLogic.execute(login);米 account=LoginLogic.execute(login);
request.setAttribute("Account",account);
米getUserId米 Mutter mutter=new Mutter(account.getUserId);
loginLogic.execute(login); //つぶやきリストを取得して、リクエストスコープに保存
米LoginLogic.execute(login)米 account=LoginLogic.execute(login);
request.setAttribute("Account",account);
}else{
//エラーメッセージをれクエストスコープに保存
request.setAttribute("errorMsg", "つぶやきが入力されていません");
}
//エラーメッセージをれクエストスコープに保存
//じゃなくてh2database使ってんだから、エラーメッセージをinsert?create? エラーメッセージはsessio?
//request.setAttribute("errorMsg", "つぶやきが入力されていません");
//フォワード RequestDispatcher dispatcher=request.getRequestDispatcher("/WEB-INF/jsp/main.jsp"); dispatcher.forward(request, response); }
}
⚫️Account.DAO
package dao;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import model.Account;
import model.Login;
public class AccountDAO {
@SuppressWarnings("finally")
//findByLoginメソッド
public Account findByLogin(Login login){
Connection conn=null;
Account account=null;
try{
//JDBCドライバを読み込み
Class.forName("org.h2.Driver");
//データベースに接続 conn=DriverManager.getConnection("jdbc:h2:file:/Users/taichi/Documents/networkspace/newsns/h2data.dat","sa",""); //SELECT文を準備 String sql="SELECT USER_ID,,TEXT FROM ACCOUNT WHERE USER_ID=? "; //自動配信のIDだからかぶることはない、だから、IDだけで大丈夫 //ちょっと複雑 PreparedStatement pStmt=conn.prepareStatement(sql); pStmt.setString(1,login.getUserId()); //SELECT文を実行し、結果表を取得 ResultSet rs=pStmt.executeQuery(); //ここで止まってる。 //一致したユーザーが存在した場合 //そのユーザーを表すAccountインスタンスを生成 if(rs.next()){ //結果表からデータを取得 String userId=rs.getString("USER_ID"); String text=rs.getString("TEXT"); //passとnameは入れない(selectにも入れてない) //これで作る、これはメソッドAccountでaccountを作る account=new Account(userId,text); //作ってexecuteで使用している。 } }catch(SQLException e){ e.printStackTrace(); }catch(ClassNotFoundException e){ e.printStackTrace(); return null; }finally{ //データベースを切断 if(conn!=null){ try{ conn.close(); }catch(SQLException e){ e.printStackTrace(); return null; } } //見つかったユーザーまたは、nullを返す。 return account; }
}
//creteメソッド
public boolean create(Account account){
Connection conn=null;
try{
//データベースへ接続
conn=DriverManager.getConnection("jdbc:h2:file:/Users/taichi/Documents/networkspace/newsns/h2data.dat","sa","");
//insert文の準備(idは自動連番なので、指定しなくてもいい) String sql="INSERT INTO ACCOUNT (USER_ID,TEXT)VALUES(?,?,?)"; PreparedStatement pStmt=conn.prepareStatement(sql); //insert文中の「?」に使用する値を指定し、SQL文を完成 //さっき作ったaccountをここで、使うinsertのときにgetUserIdとかしたやつを使う pStmt.setString(1, account.getUserId()); pStmt.setString(2, account.getText()); //insert文を実行 int result=pStmt.executeUpdate(); if(result !=1){ return false; }
}catch(SQLException e){
e.printStackTrace();
return false;
}finally{
//データベースを切断
if(conn!=null){
try{
conn.close();
}catch(SQLException e){
e.printStackTrace();
}
}
}
return true;
}
}
⚫️Account.java
package model;
//Accountは3つuserId,pass,mail
public class Account {
//フィールド
private String userId;
private String text;
//Accountメソッド引数全て、
public Account(String userId,String text){
this.userId=userId;
this.text=text;
}
//UserId.Passとか
public String getUserId(){return userId;}
public String getText(){return text;}
//getIdとtextだけにした。いいのかな?しかも、Mutterと丸かぶりだけど?
}
⚫️Mutter.java
package model; //色のついた部分が変更箇所
import java.io.Serializable;
public class Mutter implements Serializable{
/**
*
*/
private static final long serialVersionUID = 1L;
private String userId; //user内容
private String text; //つぶやき内容
public Mutter(){} public Mutter(String userId,String text){ this.userId=userId; this.text=text; } public String getUserId(){return userId;} public String getText(){return text;} //Account.javaとMutter.java同じになった }
⚫️LoginLogic
package model;
import dao.AccountDAO;
public class LoginLogic{
//executメソッド public boolean execute(Login login){ AccountDAO dao=new AccountDAO(); Account account=dao.findByLogin(login); //public Account findByLogin(Login login){となっているが引数は一つでいいの?これって、引数を一つにするやつだっけ? return account !=null; //目的は、taichiのGetMutterListLogicと同じ、つまり、insertするために、account=get.UserIdとかとするためであって、それがGetMutterListLogicでは、mutterListに追加するだけである。 }
}
⚫️Login.java
package model;
//ほとんどをloginにしてて、今から直したら、新しいエラーが大量に出そうだから、loginにmutterをいれるわ
public class Login {
private String userId;
private String text;
//Loginメソッド public Login(String userId,String text){ this.userId=userId; this.text=text; } //getUserId・getPassメソッド public String getUserId(){return userId;} public String getText(){return text;}
}
関連するコードをのせました。膨大で申し訳ありません。
どうぞご指導のほど宜しくお願いします。
回答1件
あなたの回答
tips
プレビュー