Java+ecplise+struts2+tomcat+ web開發
PS1:這裏就不多說ecplise是如何安裝的了
PS2:本來是打算把mysql怎麼連接的也添加進去,但是時間關係,這部分之後再發表到另一篇文章中
首先下載struts2的支持庫(jar文件),下載地址爲http://struts.apache.org/download.cgi,現在最新版本是2.5的版本,在這裏我們用到的是2.3的版本,原因是因爲2.3版本里面有一個blank的用例比較好用,而這個用例在2.5裏面是沒有的。
下載完之後,將其解壓得到的目錄爲
我們需要進入apps文件
將struts2-blank.war解壓得到
好的,這部分先到這裏。
這時候我們打開ecplise,注意要安裝Java EE
點擊file->new->Dynamic Web Project,如果沒有的話在file->new->other..裏面
注意,最有一個選項要選上
下面是建好的目錄
這時候用到了之前blank裏面的東西了,在blank解壓文件夾裏面,找到WEB-INF文件夾,進入該文件夾后里面有一個lib文件夾,將裏面的jar文件全部複製到我們的工程目錄下面的lib文件夾裏面
還有跟blank WEB-INF文件夾中的web.xml裏面的內容複製到我們工程目錄中的web.xml中。並修改爲下面的代碼
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
然後進入blank文件夾中的WEB-INF文件夾裏面,將struts.xml文件複製到項目的Java Resources 中方src目錄中
並對struts.xml修改成
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<constant name="struts.enable.DynamicMethodInvocation" value="false" />
<constant name="struts.devMode" value="true" />
<package name="default" namespace="/" extends="struts-default">
<action name="*">
<result>/WEB-INF/content/{1}.jsp</result>
</action>
</package>
</struts>
這裏的
<action name="*">
<result>/WEB-INF/content/{1}.jsp</result>
</action>
的意思是對於任何的action,都匹配到相應的jsp文件,下面舉個例子
對了,在工作目錄中,jsp文件最好是存放到WEB-INF中的content文件夾裏面(content文件夾自己創建)
我在工作目錄裏面創建了一個welcome.jsp的文件,內容如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>用戶登陸</title>
</head>
<body>
<form action="AuthorPro" method="post">
用戶名:<input type="text" name="author.name"/><br/>
密碼 :<input type="text" name="author.AuthorID"/><br/>
<input type="submit" value="登陸"/>
</form>
</body>
</html>
然後這時候要運行程序了,我們新建一個程序
一直next
然後雙擊下圖中 Tomcat v7.0 Server at localhost(2)
將Server Locations 中的選項選擇第二個
之後右鍵我們建的web工程 名字是lalala,選擇Run As->1 Run on server
直接finish就可以
這是界面,然後將域名改成 http://localhost:8080/lalala/welcome
這時候就能看到我們之前寫的welcome頁面了。
這裏重新回顧一下之前寫的struts.xml文件中的那句話
<action name="*">
<result>/WEB-INF/content/{1}.jsp</result>
</action>
這句話中 * 代表我們輸入的名字,例如我輸入的是welcome,這時候他就會到工程目錄中的WEB-INF/content/中找到welcome.jsp。(PS,*匹配到{1})
爲了更好的理解,我做如下改變,
<action name="*action*">
<result>/WEB-INF/content/{1}_{2}.jsp</result>
</action>
注意我的welcome.jsp 改成 wel_come.jsp,然後輸入的地址爲http://localhost:8080/lalala/wel_come
這時才能正常訪問,這時候 * action 中的第一個 匹配到{1},對應的是wel 第二個 * 匹配到的是{2} 對應的是come 中間要有一個”_”,但是這個點一般是不會弄的這麼複雜的,所以這裏理解一下就可以了。
比較喜歡寫一個用戶登錄的界面,所以我們來寫一下如何登陸頁面吧。
在src目錄下創建一個類,包Package的名字爲action,類名字爲AuthorProAction,記得點擊Add
添加action類,得到如下
內容更改爲
package action;
import com.opensymphony.xwork2.Action;
public class AuthorProAction implements Action {
private Author author;
public Author getAuthor() {
return author;
}
public void setAuthor(Author author) {
this.author = author;
}
@Override
public String execute() throws Exception {
AuthorService au=new AuthorService();
Integer i =au.validateAuthor(author);
if (i>0)
return SUCCESS;
return ERROR;
}
}
這裏會發現
有報錯的地方,那麼把鼠標放到Author上 會出現解決方法,點擊create class ”Author“
記得把包的名稱改成domin(改成別的名稱也沒有問題)然後點擊Finish
package domin;
public class Author {
private String authorID;
private String name;
private String age;
private String country;
public String getAuthorID() {
return authorID;
}
public void setAuthorID(String authorID) {
this.authorID = authorID;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((authorID == null) ? 0 : authorID.hashCode());
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Author other = (Author) obj;
if (authorID == null) {
if (other.authorID != null)
return false;
} else if (!authorID.equals(other.authorID))
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
public Author(){}
public Author(String authorID, String name, String age, String country) {
super();
this.authorID = authorID;
this.name = name;
this.age = age;
this.country = country;
};
}
這裏其實只要寫入
package domin;
public class Author {
private String authorID;
private String name;
private String age;
private String country;
}
就行了,然後alt+shift+s 點擊後,會出現一個選擇框,選擇Generate Getters and Setters 進入後將
Select All選上就能創建出
public class Author {
private String authorID;
private String name;
private String age;
private String country;
public String getAuthorID() {
return authorID;
}
public void setAuthorID(String authorID) {
this.authorID = authorID;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
}
判斷相同 用shift+alt+s的到的對話框中的Generate hashCode() and equals() ,因爲判斷是否相同只需要判斷authorID跟name是否相同就能判斷兩個人是否一樣,所以選中如下圖
點擊ok,還有一個則是shift+alt+s 選中Generate Constructor using Fields
public Author(){}
這句話要自己輸入
回頭看之前的AuthorProAction.java文件,發現錯誤少了一堆,對於在AuthorService也是創建一個類
記得把package改成service(同樣其他的名字也可以),代碼如下
package service;
import java.util.ArrayList;
import java.util.List;
import domin.Author;
public class AuthorService {
static List<Author> authorDb;
static {
authorDb=new ArrayList<>();
authorDb.add(new Author("110","lala","18","中國"));
//這裏對應的實是
/*Author裏面的東西,如果age是int類型的話 那麼應該-> authorDb.add(new Author("110","lala",18,"中國"));
* private String authorID;
private String name;
private String age; ->(private int age)
private String country;
*/
}
public Integer validateAuthor(Author author) {
for(Author u:authorDb){
if(u.equals(author)){
return 1;
}
}
return -1;
}
}
現在我們要配置struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<constant name="struts.enable.DynamicMethodInvocation" value="false" />
<constant name="struts.devMode" value="true" />
<package name="default" namespace="/" extends="struts-default">
<action name="AuthorPro" class="action.AuthorProAction">
<result name="success">/WEB-INF/content/Menu.jsp</result>
<result name="error">/WEB-INF/content/error.jsp</result>
</action>
<action name="*">
<result>/WEB-INF/content/{1}.jsp</result>
</action>
</package>
</struts>
記得要把 name =*那個action放到最下面,不然全都被他匹配走了。
這裏來解釋一下
<action name="AuthorPro" class="action.AuthorProAction">
<result name="success">/WEB-INF/content/Menu.jsp</result>
<result name="error">/WEB-INF/content/error.jsp</result>
</action>
action name=”AuthorPro“這個名字對應的是welcome.jsp文件中form裏面的那個action的名字,在前臺welcome中,點擊按鈕,會到後臺struts.xml中尋找相對應的action,依據方法就是action name,找到action後,回到後面的class中找到相應的方法,上面的例子就是到action.AuthorProAction.java中找,一般在
中還有一句隱藏的
在沒有寫method的情況下默認的是execute這個方法。
點擊登錄
進入到Menu界面,但是我們並沒有創建,所以報錯了
輸入一個錯誤的賬號密碼
會跳轉到另一個界面