如何使用MyEclipse開發一個JavaWeb網站
本文所述的內容僅用於參考或學習,主要針對畢業設計等網站設計,請勿實際用於生產開發用途,否則後果自負:
MyEclipse的安裝
這裏我使用的是MyEclipse10.7.1,下載地址 [ 度盤 ],密碼:6aw3。破解方法:博客,補丁下載地址:腳本之家
新建項目
打開MyEclipse後如圖所示:
這裏的Java_SSH_Easyer是我已經建好的項目。我們點擊菜單欄的File->New->Web Project
內容 | 含義 | 註釋 |
---|---|---|
Project Name | 項目名 | 你項目叫什麼,推薦用英文 |
Location | 存放位置 | 項目放在哪,默認放在工作空間裏 |
Source folder | Src目錄 | java源代碼放的位置,默認就src |
web root folder | 網站jsp目錄 | 前端資源等文件存放位置(網站根目錄) |
J2EE Specification Level | JavaEE版本 | 選最新的就好了 |
填寫完畢後點擊 Finish 就可以了
編碼
推薦使用UTF-8編碼進行編寫網站。修改方法:Window->Preferences->General->Workspace
Text file Encoding欄選擇Other,下拉選擇UTF-8即可。
導入Struts2、Hibernate並配置MySQL
struts2
選擇2.1並選擇/*
MySQL
安裝MySQL:MySQL下載
安裝過程請按照這裏的教程進行安裝,注意編碼一定要填寫UTF-8
Hibernate
Hibernate必須在MySQL安裝之後進行(如果要求用sqlserver就安裝sqlserver後進行)
點擊Window->Open Perspective->MyEclipse Hibernate
右鍵點擊DB Browser,選new
這裏按照如圖所示的內容進行填寫:
這裏的mysql-connector-java-3.1.6-bin.jar在這裏下載
這裏的數據庫名就在你的數據庫管理軟件裏進行創建吧。個人用的phpMyAdmin,我想大多數人用的應該是Navicat For MySQL。
這裏配置好之後點擊Test Driver按鈕,如果出現如圖所示的窗口,那麼配置正確點擊Finish就可以了。如果發生錯誤檢查一下數據庫的用戶名密碼是否正確,數據庫是否開啓等問題。
點擊右上角的MyEclipse圖標形狀的按鈕回到原來的頁面:
右鍵點擊我們的項目,選擇MyEclipse->Add Hibernate Capabilities…項
點擊Next,繼續Next到這個頁面:
下拉DB Driver選擇我們剛剛創建的MySQL,再點擊Next後把Create SessionFactory的對勾點掉點擊Finish即可。
導入個人編寫的Java_SSH_Easyer
個人編寫的代碼並不適用於生產環境,如需應用請斟酌使用。
Github:JAVA_SSH_Easyer
下載ZIP後將/src/struts.xml內容複製到項目中src/struts.xml中保存。這個代碼中的大部分內容是範例內容。需要進行修改。
自己建立三個包,包名可以自己定,但最後要爲action、hibernate、tools例如你叫李華可以叫com.lihua.action,com.lihua.hibernate,com.lihua.tools:
將我的項目中src\com\pingjia中的三個文件夾中的java文件按包名拖到對應的包中:
逐個打開文件,將裏面的所有com.pingjia改成你的包名如com.lihua。
將zip中的webroot文件夾下的Public與User文件夾拷貝到項目的WebRoot文件夾下:
將login.jsp上的包名改成你的包名。至此基本配置結束。
登錄Demo
現在用剛剛搭建好的框架寫一個登錄功能吧!
首先要確定登錄功能需要哪些內容:
- 登錄頁*1
- 登錄後的主頁*1
- 登錄功能*1
需要的數據:
- 用戶數據
第一步 建立數據表並逆向生成數據庫表爲實體類到項目
用戶數據需要用戶名、密碼、用戶id三項內容,所以我們在數據庫中創建一個User表:
隨便插一個用戶,比如用戶名是admin,密碼是admin。
我們在mysql中建立了一個新表,所以要用Hibernate的逆向工程生成一個對應的實體類。我的範例中原有一個User實體類,將它刪掉:com.lihua.hibernate.User
原本範例中也有一個UserAction用作範例作用也可以刪掉重新建立:com.lihua.action.UserAction
新建逆向工程的方法:
到Hibernate界面雙擊MySQL,在Connected to Mysql>你數據庫名>table下找到剛剛建立的user表:
右鍵點擊它,然後點擊Hibernate Reverse Engineering
打上JavaDataObject的對勾和Create POJO<>DB Table mapping information的對勾,去掉absolute對勾,java package選擇你對應的Hibernate包後點下一步:
由於mysql支持auto increasement,id generator項選擇identity後點擊finish,提示will be overwritten選是就行了。
返回myeclipse界面後我們會看到com.lihua.hibernate包下出現了一個User.java類,說明逆向工程成功了。
第二步 創建Action並處理業務請求
這裏使用Action用於處理業務內容,struts.xml用於處理Action具體方法與jsp、路由(對應瀏覽網址)的對應關係。
用戶訪問網址後服務器根據struts進行解析,新建指定Action的實例並調用指定方法,並根據方法返回值顯示指定頁面。
我們在com.lihua.action中新建一個類,名字叫UserAction繼承自BaseAction並重寫check方法:
package com.lihua.action;
public class UserAction extends BaseAction{
@Override
public boolean check() {
// TODO Auto-generated method stub
return false;
}
}
這個check方法就是Action的攔截器,默認返回true就可以了。如果有需要可以判斷登錄狀態。這裏要寫登錄功能,所以不能讓check返回false。
我們新建的這個Action類相當於一類頁面和功能的集合,這裏UserAction處理用戶相關的頁面請求,一會要建立的HomeAction用於處理後臺相關頁面的請求。
這裏我們有兩個任務:1.登錄頁,2.登錄功能
登錄頁暫時不需要向前端傳送什麼,所以直接返回SUCCESS;就可以了。登錄功能需要判斷登錄所用用戶名與密碼是否正確,所以要調用數據庫。首先建立兩個方法:
public String login(){
return SUCCESS;
}
public String checkLogin(){
return SUCCESS;
}
所有頁面請求的方法都需要返回String,後續需要在struts.xml中添加。
有關數據處理:
在checkLogin中我們需要獲取前端傳來的數據。我在BaseAction中對數據獲取進行了封裝,在方法中直接使用p方法即可:
String username = p("username");
String password = p("password");
查詢數據庫使用M方法的各種操作即可。詳情請看Readme.md
DB_Where where = new DB_Where();
where.setWhere("username", username);
where.setWhere("password", password);
List<User> s = (List<User>) M("User").where(where).select();
if(s.isEmpty())
return error("登錄失敗");
判斷s是否爲空即可判斷用戶名密碼是否正確了。這裏的error方法是BaseAction的封裝,用於功能類方法的成功與失敗提示與跳轉,有三個重載,第一個參數是提示內容,必須要有。第二個參數是目標跳轉的url,默認是上一個頁面。第三個參數是等待時間,默認error5秒,success2秒。
登錄成功後需要將數據寫入到session中。這裏BaseAction也進行了封裝,使用session(“鍵名”,值);即可存儲session,使用session(“鍵名”);即可讀取session。
所以登錄功能的完整代碼:
package com.lihua.action;
import java.util.List;
import com.lihua.hibernate.User;
import com.lihua.tools.DB_Where;
public class UserAction extends BaseAction{
private static final long serialVersionUID = -4987597667769252852L;
@Override
public boolean check() {
// TODO Auto-generated method stub
return true;
}
public String login(){
return SUCCESS;
}
public String checkLogin(){
String username = p("username");
String password = p("password");
DB_Where where = new DB_Where();
where.setWhere("username", username);
where.setWhere("password", password);
List<User> s = (List<User>) M("User").where(where).select();
if(s.isEmpty())
return error("登錄失敗");
session("User",s.get(0));
return success("登錄成功","Home/index");
}
}
我們再建立一個HomeAction當做臨時的後臺Action:
package com.lihua.action;
public class HomeAction extends BaseAction{
private static final long serialVersionUID = -4972832333971194628L;
@Override
public boolean check() {
if(session("User")==null)
return false;
return true;
}
public String index(){
return SUCCESS;
}
}
第三步 編寫struts.xml
打開src/struts.xml,內容如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<!--package和類名一致最好,namespace設置成/類名就可以了,主要用於u方法獲取鏈接,方便管理,加強可讀性-->
<package name="User" namespace="/User" extends="struts-default">
<!--下面兩句創建package就要加上,因爲success與error方法用了-->
<global-results>
<result name="input">/Public/success.jsp</result>
<result name="error">/Public/error.jsp</result>
</global-results>
<!--下面action名稱就隨便命了,不過推薦以類方法命名。後面class和method就是要調用的Action的方法了。-->
<action name="login" class="com.pingjia.action.UserAction" method="login">
<!--result就寫一個就行了。有特殊需求就多寫。如果action方法返回只有error()或success()那就不用寫result。-->
<result name="success">/User/login.jsp</result>
</action>
<action name="reg" class="com.pingjia.action.UserAction" method="reg">
<result name="success">/User/reg.jsp</result>
</action>
<action name="checkLogin" class="com.pingjia.action.UserAction" method="checkLogin">
<result name="success" type="redirectAction">login</result>
</action>
<action name="checkReg" class="com.pingjia.action.UserAction" method="checkReg">
<result name="success" type="redirectAction">login</result>
</action>
<action name="logout" class="com.pingjia.action.UserAction" method="logout">
<result name="success" type="redirectAction">login</result>
</action>
</package>
</struts>
根據我們頁面的設計我們共有三個頁面:Home/index、User/login、User/checkLogin,兩個Action。所以要建立兩個package(globa-results是Action中success與error方法要用到的,每個package都要添加):
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<package name="User" namespace="/User" extends="struts-default">
<global-results>
<result name="input">/Public/success.jsp</result>
<result name="error">/Public/error.jsp</result>
</global-results>
</package>
<package name="Home" namespace="/Home" extends="struts-default">
<global-results>
<result name="input">/Public/success.jsp</result>
<result name="error">/Public/error.jsp</result>
</global-results>
</package>
</struts>
逐個添加方法:
login(需要顯示前端,所以要寫好success):
<action name="login" class="com.lihua.action.UserAction" method="login">
<result name="success">/User/login.jsp</result>
</action>
checkLogin:
<action name="checkLogin" class="com.lihua.action.UserAction" method="checkLogin"></action>
index:
<action name="index" class="com.lihua.action.HomeAction" method="index">
<result name="success">/Home/index.jsp</result>
</action>
最終生成的struts.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<package name="User" namespace="/User" extends="struts-default">
<global-results>
<result name="input">/Public/success.jsp</result>
<result name="error">/Public/error.jsp</result>
</global-results>
<!--下面action名稱就隨便命了,不過推薦以類方法命名。後面class和method就是要調用的Action的方法了。-->
<action name="login" class="com.lihua.action.UserAction" method="login">
<result name="success">/User/login.jsp</result>
</action>
<action name="checkLogin" class="com.lihua.action.UserAction" method="checkLogin"></action>
</package>
<package name="Home" namespace="/Home" extends="struts-default">
<global-results>
<result name="input">/Public/success.jsp</result>
<result name="error">/Public/error.jsp</result>
</global-results>
<action name="index" class="com.lihua.action.HomeAction" method="index">
<result name="success">/Home/index.jsp</result>
</action>
</package>
</struts>
第四步 創建jsp頁面
根據我們struts.xml的設置,我們需要建立兩個文件:
/Home/index.jsp,/User/login.jsp,這兩個一個是後臺首頁,另一個是登錄頁。我們新建這兩個文件,推薦從原有login.jsp複製並重命名。
登錄頁需要提交一個username,password的表單到/User/checkLogin
於是可以在login.jsp頁面寫:
<form action="<%=Tool.u("User/checkLogin")%>" method="POST">
<p>用戶名<input type="text" name="username"></p>
<p>密碼<input type="text" name="password"></p>
<p><button type="submit">提交</button></p>
</form>
Home/index.jsp暫時不寫。
網站默認訪問的頁面是根目錄下的index.jsp,我們可以在index.jsp下寫一個跳轉js跳轉到login功能。把WebRoot/User/login.jsp內容直接複製到WebRoot下的index.jsp裏並保存,並寫一段js:
<script>location.href="<%=Tool.u("User/login")%>";</script>
下面我們就可以運行測試了,右鍵點擊我們的項目,點擊Run As->MyEclipse Server Application運行。然後就能看到我們的登錄頁面了。隨便輸個錯誤密碼點登錄,然後輸正確密碼點登錄測試一下看看效果吧~
這個是我從tp模板上套來的,覺得不美觀可以替換修改成自己喜歡的頁面,位置在WebRoot/Public下。
內容管理DEMO
說到管理,無非就是增刪改查。那麼我們怎麼在javaweb下進行增刪改查呢?
下面我們來寫一個用戶管理的例子
查
我們在UserAction中進行編寫userList方法,Action只負責權限的驗證與數據的處理。
public String userList(){
if(session("User")==null)
return error("請登錄","User/login");
User u = (User)session("User");
if(u.getId()!=1)
return error("請登錄","User/login");//規定uid是1的才能管理用戶列表
this.assign("userlist", M("User").select());
return SUCCESS;
}
struts.xml略
jsp頁面:
<%@ page language="java" import="java.util.*,com.lihua.tools.Tool" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<table>
<tr>
<th>用戶id</th>
<th>用戶名</th>
</tr>
<s:iterator value="userlist" id="u">
<tr>
<td><s:property value="#u.id" /></td>
<td><s:property value="#u.username" /></td>
</tr>
</s:iterator>
</table>
這裏的s標籤用法盡情的百度搜索一大堆。
增
我們在UserAction中進行編寫addUser方法。
public String addUser(){
if(session("User")==null)
return error("請登錄","User/login");
User u = (User)session("User");
if(u.getId()!=1)
return error("請登錄","User/login");//規定uid是1的才能管理用戶列表
if(p("username")!=null){//添加用戶
User s = new User();
s.setUsername(p("username"));
s.setPassword(p("password"));
M("User").add(s);
return success("添加成功","User/userList");
}
return SUCCESS;
}
struts.xml略
jsp頁面:
<%@ page language="java" import="java.util.*,com.lihua.tools.Tool" pageEncoding="UTF-8"%>
<form action="" method="POST">
<p><input type="text" name="username"></p>
<p><input type="text" name="password"></p>
<p><button>添加</button></p>
</form>
刪
我們在UserAction中進行編寫delUser方法。
public String delUser(){
if(session("User")==null)
return error("請登錄","User/login");
User u = (User)session("User");
if(u.getId()!=1)
return error("請登錄","User/login");//規定uid是1的才能管理用戶列表
if(p("uid")==null)
return error("非法操作");
int uid=0;
try{
uid=Integer.parseInt(p("uid"));//get傳個uid過來就能刪了這個用戶了。
}catch(Exception e){
return error("非法操作");
}
M("User").delete(uid);
return success("刪除成功","User/userList");
}
struts.xml略
可以在userList頁面中這樣調用:
<a href="<%=Tool.u("User/delUser")%>?uid=<s:property value="#u.id" />">刪除</a>
改
我們在UserAction中進行編寫editUser方法。
public String editUser(){
if(session("User")==null)
return error("請登錄","User/login");
User u = (User)session("User");
if(u.getId()!=1)
return error("請登錄","User/login");//規定uid是1的才能管理用戶列表
if(p("id")!=null){//提交了
int id=0;
try{
id=Integer.parseInt(p("id"));//get傳個uid過來就能刪了這個用戶了。
}catch(Exception e){
return error("非法操作");
}
User sv = (User) M("User").find(id);
if(sv==null)
return error("用戶不存在");
sv.setPassword(p("password"));
sv.setUsername(p("username"));
M("User").save(sv);
return success("修改成功","User/userList");
}
if(p("uid")==null)
return error("非法操作");
int uid=0;
try{
uid=Integer.parseInt(p("uid"));//get傳個uid過來就能刪了這個用戶了。
}catch(Exception e){
return error("非法操作");
}
User s = (User) M("User").find(uid);
if(s==null)
return error("用戶不存在");
this.assign("user",s);
return SUCCESS;
}
struts.xml略
jsp:
<%@ page language="java" import="java.util.*,com.lihua.tools.Tool" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<form action="" method="POST">
<p><input type="text" name="username" value="<s:property value='#user.username' />"></p>
<p><input type="text" name="password" value="<s:property value='#user.password' />"></p>
<input type="hidden" name="id" value="<s:property value='#user.id' />">
<p><button>保存</button></p>
</form>
綜合
修改userList.jsp爲如下內容:
<%@ page language="java" import="java.util.*,com.lihua.tools.Tool" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<a href="<%=Tool.u("User/addUser")%>">新增</a>
<table>
<tr>
<th>用戶id</th>
<th>用戶名</th>
<th>操作</th>
</tr>
<s:iterator value="userlist" id="u">
<tr>
<td><s:property value="#u.id" /></td>
<td><s:property value="#u.username" /></td>
<td>
<a href="<%=Tool.u("User/delUser")%>?uid=<s:property value="#u.id" />">刪除</a>
<a href="<%=Tool.u("User/editUser")%>?uid=<s:property value="#u.id" />">修改</a>
</td>
</tr>
</s:iterator>
</table>
效果如圖:
總結
基本的管理頁面骨架已經出來了。最後需要大家根據各種模板的樣式等等對骨架進行加工。
登錄後的Home/index可以存放一個iframe用於加載用戶菜單頁面。登錄頁面模板也很多。當然也很推薦大家自己用基本的框架寫諸如bootstrap,layui之類的。如果在寫代碼的時候遇到什麼問題請在下方回覆,我會盡量幫忙解決。
附錄
最終struts.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<package name="User" namespace="/User" extends="struts-default">
<global-results>
<result name="input">/Public/success.jsp</result>
<result name="error">/Public/error.jsp</result>
</global-results>
<!--下面action名稱就隨便命了,不過推薦以類方法命名。後面class和method就是要調用的Action的方法了。-->
<action name="login" class="com.lihua.action.UserAction" method="login">
<result name="success">/User/login.jsp</result>
</action>
<action name="userList" class="com.lihua.action.UserAction" method="userList">
<result name="success">/User/userList.jsp</result>
</action>
<action name="addUser" class="com.lihua.action.UserAction" method="addUser">
<result name="success">/User/addUser.jsp</result>
</action>
<action name="editUser" class="com.lihua.action.UserAction" method="editUser">
<result name="success">/User/editUser.jsp</result>
</action>
<action name="delUser" class="com.lihua.action.UserAction" method="delUser"></action>
<action name="checkLogin" class="com.lihua.action.UserAction" method="checkLogin"></action>
</package>
<package name="Home" namespace="/Home" extends="struts-default">
<global-results>
<result name="input">/Public/success.jsp</result>
<result name="error">/Public/error.jsp</result>
</global-results>
<action name="index" class="com.lihua.action.HomeAction" method="index">
<result name="success">/Home/index.jsp</result>
</action>
</package>
</struts>
最終UserAction.java
package com.lihua.action;
import java.util.List;
import com.lihua.hibernate.User;
import com.lihua.tools.DB_Where;
import com.lihua.tools.Tool;
public class UserAction extends BaseAction{
private static final long serialVersionUID = -4987597667769252852L;
@Override
public boolean check() {
// TODO Auto-generated method stub
return true;
}
public String login(){
return SUCCESS;
}
public String checkLogin(){
String username = p("username");
String password = p("password");
DB_Where where = new DB_Where();
where.setWhere("username", username);
where.setWhere("password", password);
List<User> s = (List<User>) M("User").where(where).select();
if(s.isEmpty())
return error("登錄失敗");
session("User",s.get(0));
return success("登錄成功","Home/index");
}
public String userList(){
if(session("User")==null)
return error("請登錄","User/login");
User u = (User)session("User");
if(u.getId()!=1)
return error("請登錄","User/login");//規定uid是1的才能管理用戶列表
List<?> l = M("User").select();
this.assign("userlist", l);
return SUCCESS;
}
public String addUser(){
if(session("User")==null)
return error("請登錄","User/login");
User u = (User)session("User");
if(u.getId()!=1)
return error("請登錄","User/login");//規定uid是1的才能管理用戶列表
if(p("username")!=null){//添加用戶
User s = new User();
s.setUsername(p("username"));
s.setPassword(p("password"));
M("User").add(s);
return success("添加成功","User/userList");
}
return SUCCESS;
}
public String delUser(){
if(session("User")==null)
return error("請登錄","User/login");
User u = (User)session("User");
if(u.getId()!=1)
return error("請登錄","User/login");//規定uid是1的才能管理用戶列表
if(p("uid")==null)
return error("非法操作");
int uid=0;
try{
uid=Integer.parseInt(p("uid"));
}catch(Exception e){
return error("非法操作");
}
M("User").delete(uid);
return success("刪除成功","User/userList");
}
public String editUser(){
if(session("User")==null)
return error("請登錄","User/login");
User u = (User)session("User");
if(u.getId()!=1)
return error("請登錄","User/login");//規定uid是1的才能管理用戶列表
if(p("id")!=null){//提交了
int id=0;
try{
id=Integer.parseInt(p("id"));//get傳個uid過來就能刪了這個用戶了。
}catch(Exception e){
return error("非法操作");
}
User sv = (User) M("User").find(id);
if(sv==null)
return error("用戶不存在");
sv.setPassword(p("password"));
sv.setUsername(p("username"));
M("User").save(sv);
return success("修改成功","User/userList");
}
if(p("uid")==null)
return error("非法操作");
int uid=0;
try{
uid=Integer.parseInt(p("uid"));//get傳個uid過來就能刪了這個用戶了。
}catch(Exception e){
return error("非法操作");
}
User s = (User) M("User").find(uid);
if(s==null)
return error("用戶不存在");
this.assign("user",s);
return SUCCESS;
}
}