質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
JSP

JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

servlet

Servletとは、Webページの動的な生成やデータ処理などをサーバ上で実行するために、Javaで作成されたプログラムです。 ショッピングサイトやオンラインバンキングといった、動的なウェブサイトの構築に用いられています。

Q&A

解決済

1回答

3405閲覧

更新しました。よろしくお願いします。servletでsnsを作ってみたのですが、コンパイルエラーが出ます。何か基本的なミスはないでしょうか?

edoooooo

総合スコア476

JSP

JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

servlet

Servletとは、Webページの動的な生成やデータ処理などをサーバ上で実行するために、Javaで作成されたプログラムです。 ショッピングサイトやオンラインバンキングといった、動的なウェブサイトの構築に用いられています。

0グッド

2クリップ

投稿2015/12/01 23:02

編集2015/12/02 09:08

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;}

}

関連するコードをのせました。膨大で申し訳ありません。
どうぞご指導のほど宜しくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

argius

2015/12/02 02:48

回答者の方々も書いてくださっていますが、エラーメッセージを見るということが実践できていないように見えます。基本的な文法レベルのミスも多いです。一歩を踏み出す前に、進むより振り返ってみた方が良いと思います。
edoooooo

2015/12/02 05:38

ありがとうございます。指摘いただいたところと、一つ一つカーソルを合わせたときに出るエラーをグーグルで調べて、解決していきたいとおもいます。
edoooooo

2015/12/02 08:54 編集

エラーが30箇所ぐらいあったのですが、色々書いていただいたことや、キーワードを見直したところ、エラーが8個になりました。 Main.javaを更新したのですが、米login米 のように米の後のカッコにその行の赤波線が引いてある場所を記しました。どうぞよろしくお願いします。l
guest

回答1

0

ベストアンサー

コンパイルエラーはどこでどんなエラーが出ているかを全て出してくれているはずです。
それは読んでいますか?

エラー内容が分からないと何とも言えないのですが、とりあえず分かるのは、

Java

1LoginLogic loginLogic=new LoginLogic(); 2Account account = LoginLogic.execute(Login login); // 型名.executeになっているのでエラー 3 // また、(Login login)とは書けない

上記部分ですが、2行目をloginLogic.execute(new Login()); とすればエラーが消える気がします。
また1行目と同じコードが同じ関数内に散見されますので、エラーが出ている1行目と同じ行は削除してください。
(既に宣言されている変数を再度宣言しているのでエラーが出ています。)

他はエラーメッセージが分からないと考えるのが大変なので書きません。

投稿2015/12/02 00:10

moredeep

総合スコア1507

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

trick

2015/12/02 01:07

moredeepさんも言っていますが エラー内容が出ていると思いますので それを参考に1つずつ潰していってください。 米 Loginlogic loginLoigic=new LoginLogic(); 米 LogicLogic.execute(account); この当たりは記載ミスですかね? クラス名、変数名の大文字、小文字を見直してみてください。
liguofeng29

2015/12/02 01:25

HttpSession session=request.getSession(); こちらの行とかは通常コンパイルエラーがでるとは考えにくいですが、 なんというエラーメッセージなのかを提示できますか。
edoooooo

2015/12/02 06:24

moredeepさんありがとうございます。  loginLogicのところを直して、繰り返しになっているコードを直して、カッコを一つ直して、スペルミスを、一つ直しただけで、エラーが30から8個に減りました。ありがとうございます。
edoooooo

2015/12/02 06:27

trickさんありがとうございます。エラーが驚くほど減りました。30個出たときに、これは、何か大きな問題があるのではとおもったのですが、普通のエラーの積み重なりだったことに驚いています。一つづつ潰していきます。ありがとうございます。
edoooooo

2015/12/02 06:55 編集

liguofeng29さん、ありがとうございます。  エラーなのですが、カーソルを赤波線の出ているsessionの上に置くと、Duplicate local variable: 1quick fix available: Rename 'session' というクリック可能な文字が出てきます。 そこをクリックすると、session1という、sessionができてしまいます。 sessionがかぶってしまうということでしょうか? 以前にも、sessionを作ろうとしたときに出てきたのですが、そのときは、改善できずに、session.invalidata(); だったと思うのですが、それを追加するのをやめました。  解決方法などがありましたら、ご指導のほどどうぞよろしくお願いします。
moredeep

2015/12/02 06:59

Duplicate local variableは既に宣言されている変数を再度宣言しているために出るエラーです。 他の箇所で変数名sessionを宣言していないかを確認してください。
edoooooo

2015/12/02 08:23

既に宣言されている変数を再度宣言しているのでエラーが出ています。と先ほどいただいたアドバイス通りに//ここも同じだから消す。HttpSession session=request.getSession(); このようにコメントアウトしました。  宣言を繰り返しては、いけないことを覚えました。基礎はやったはずなのに、生かすことができませんでした。頑張ってみます。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問