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界面,但是我们并没有创建,所以报错了
输入一个错误的账号密码
会跳转到另一个界面