struts
html
開發模式:MVC模式(Model,View,Control)前端
M-Model模型
java
模型的職責是複雜業務邏輯,包含兩部分:業務數據和mysql
業務處理邏輯。好比實體類,DAO,Service都是web
V-View視圖spring
視圖是負責顯示界面和用戶交互sql
屬於視圖的類是不包含業務邏輯和控制邏輯的JSP數據庫
C-Conrtrollerr控制器apache
控制器是模型層M和視圖層V之間的橋樑,用於控制流程
app
ActionServlet
Struts2 HelloWorld
1)拷貝Struts2的核心jar包到web-inf/lib/下
sturts2-core-2.1.8.1.jar
核心包,
xwork-core-2.1.6.jar
是WebWork內核
ognl-2.7.3.jar
支持ognl表達式,相似於EL表達式
freemarker-2.3.15.jar
commons-fileupload-1.2.1.jar
用於實現文件上傳功能的jar包
在web.xml中配置Struts2的前端控制器
用Filter實現的前端控制器
<web-app>
<filter>
<filter-name>Struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.ng.filter.Struts2PrepareAndExecuteFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>Struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
新建頁面nameform.jsp
<html>
...
<body>
<form action="/outman/day/welcome.action" method="post">
<input name="name" type="text"/>
<input value="提交" type="submit"/>
</form>
...
</html>
新建頁面welcome.jsp
...
<body>
<h1> Welcome,$(name)
</h1>
</body>
新建WelcomeAction
public class WelcomeAction{
private String name;
public String execute(){
System.out.println("name" + name);
if("monster".equalsIgnoreCase(name)){
return "fail";
}
return "success";
}
public String getName(){
return name:
}
public void setName(String name){
this.name = name;
}
Sturuts2提供的方便之處:
1數據的自動的封裝
根據頁面組件的name屬性,自動封裝到Action中對應的name屬性中。
2數據的自動傳遞
Action中的屬性會在jsp頁面能夠直接用EL表達式拿到
9)寫struts2所須要的配置文件struts.xml
struts.xml文件告訴Struts2\請求對應的java類
<struts>
<package name="helloworld" extends="struts-default"
namespace="/day01">
<action name="welcome" class="com.ccc.outman.WelcomeAction">
<result name="success">/jsp/welcome.jsp</result>
<result name="fail">/jsp/nameform.jsp</result>
</action>
</package>
<案例2>
Struts2鏈接數據庫
須要導入的jar包
Struts2的jar包
Mysql的驅動
Jstl的jar包
②建立實體類
id,name,...以及get,set方法
③拷貝database.properties到src目錄下
username = root
password = root
driver = com.mysql.jdbc.Driver
url = jdbc:mysql://localhost:3306/test
ConnectionUtils.java
public class ConnectionUtils{
private static String url;
private static String driver;
private static String username;
private static String password;
static{
Properties props = new Properties();
try{
//從屬性文件中讀取數據庫配置信息
props.load(ConnectionUtils.class.getClassLoader().getResourceAsStream
("database.properties"));
}catch(IOException e){
e.printStackTrace();
}
if(props != null){
url = props.getProperty("url");
driver = props.getProperty("driver");
username = props.getProperty("username");
password = props.getProperty("password");
//裝載並註冊數據庫驅動
try{
Class.forName(driver);
}catch(ClassNotFoundException e){
e.printStackTrace();
}
public static Connection openConnection() throws SQLException{
return DriverManager.getConnection(url,username,password);
}
conn.close(),stmt.close(),rs.close();
public static void main(String[] args) {
Connection conn = openConnection();
System.out.println(conn);
}
9)新建ProjectDAO
public class ProjectDao{
private static final String findAll =
"select * from t_project";
public List<Project> findAll(){
Connection conn = null;
PreparedStatement stmt = null;
ResultSet rs = null;
try{
conn = ConnectinUtils.openConnection();
stmt = conn.prepareStatement(findAll);
rs = stmt.executeQuery();
List<Project> list = new ArrayList<Project>();
while(rs.next()){
Project project = new Project();
project.setId(rs.getInt(1));
project.setName(rs.getString(2));
projec.....
}
return list;
...
}
public static void main(String[] args){
ProjectDao dao = new ProjectDao();
List<Project> list = dao.findAll();
for(Project p:list){
System.out.println(p.getName());
}}}
11)新建ProjectListAction
public class ProjectListAction{
private List<Project> projectList;
public String execute(){
ProjectDao projectDao = new ProjectDao();
projectList = projectDao.findAll();
return "success";
}
get,set方法
struts2框架中的關於service的做用:
service層配置了事務,由spring管理.
struts的action裏調用的時候,通常都調用service層封裝的方法.由於service層的方法可能會調用多個DAO層的方法.
舉個例子說明一下,假入說我有一個需求,就是銀行的轉賬需求吧,當A給B匯款1000元這個過程,A的賬戶裏應該減小1000元,B的賬戶應該增長1000元,而這個過程是由2個DAO方法實現的,即A減小的方法,B增長的方法.而service層的轉賬方法(起名叫getResult方法)裏面先調用了DAO層A減小的方法,再調用B增長的方法.配置文件的事務配置的是管理service層的事務,只有service層的轉賬方法完成了DAO層的兩個方法,纔算這個事務結束.若是直接調用DAO層的方法,那麼spring不會管理事務,每次調用DAO的方法就算單獨的一個事務,若是程序運行不穩定,A減小1000元的方法成功,B增長1000元的方法失敗的狀況下,因爲此時的事務不是同一個事務.那麼A的事務不會回滾.....結果就是數據庫裏面A少了1000塊錢,B沒有增長1000塊錢........錢那裏去了........出大錯了吧,這個錯誤夠嚴重了吧!
13)配置struts2.xml,web.xml
.jsp文件