action運(yùn)行,拼接下拉框,商品展示,STRUTS2,密碼,MD5,代碼改后未起效【詩書畫唱】
CTRL+F:STRUTS2登錄注冊(cè)加載下拉框中的數(shù)據(jù)的講義,視頻筆記 ,MD5介紹,登錄注冊(cè)的例子視頻筆記 ,struts2框架,action中跳轉(zhuǎn)界面且用EL表達(dá)式獲取傳過來的變量的方法。加載下拉框例子。關(guān)于eclipse的卡頓問題,代碼改后未起效問題(eclipse,Java Web項(xiàng)目有時(shí)就是有這種bug和缺陷)。項(xiàng)目刪除干凈的方法。關(guān)于空指針異常等JDBC鏈接數(shù)據(jù)庫報(bào)錯(cuò)問題。如何判斷你真正掌握應(yīng)該掌握的內(nèi)容了。登錄注冊(cè)的SQL代碼。action運(yùn)行成功的必要條件。作業(yè)和自己給出的答案。商品展示和商品詳情的例子。
提示:密碼是不能明文地存放在數(shù)據(jù)庫中的,而應(yīng)該通過MD5加密然后保存在數(shù)據(jù)庫中。
struts2框架中使用ajax技術(shù)。個(gè)人為視頻筆記很重要,值得記錄和搜索查看。
一般先記錄例子,后做視頻筆記(或者反著來,總之這2項(xiàng)記錄一般基本都要做),可以視頻筆記和例子結(jié)合起來,一起記錄。
可以先看教程視頻,之后截圖步驟和各個(gè)例子要的文件和要注意的事等。例子分開記,方便以后更靈活,自由地組合。
如何判斷你真正掌握應(yīng)該掌握的內(nèi)容了 START
自己改寫代碼的變量名等后仍然可以運(yùn)行正確。就是說你可以根據(jù)原來內(nèi)容創(chuàng)作并記錄下修改后仍然可以用,有效,不會(huì)報(bào)錯(cuò),至少有原來的內(nèi)容的運(yùn)行效果。
如何判斷你真正掌握應(yīng)該掌握的內(nèi)容了 END
項(xiàng)目刪除干凈的方法 START

項(xiàng)目刪除干凈的方法 END
關(guān)于空指針異常等JDBC鏈接數(shù)據(jù)庫報(bào)錯(cuò)問題 START

關(guān)于空指針異常等JDBC鏈接數(shù)據(jù)庫報(bào)錯(cuò)問題 END
STRUTS2登錄注冊(cè)加載下拉框中的數(shù)據(jù)的講義 START
理應(yīng)實(shí)現(xiàn):
登錄注冊(cè)功能。
加載下拉框。
密碼是不能明文地存放在數(shù)據(jù)庫中的,而應(yīng)該通過MD5加密然后保存在數(shù)據(jù)庫中。
struts2框架中使用ajax技術(shù)
STRUTS2登錄注冊(cè)加載下拉框中的數(shù)據(jù)的講義 END
視頻筆記 START

MD5介紹 START
MD5是baimessage-digest algorithm 5(信息-摘要算法)的縮寫,被廣泛用于加密和解密技術(shù)上,它可以說是文件的“數(shù)字指紋”。任何一個(gè)文件,無論是可執(zhí)行程序、圖像文件、臨時(shí)文件或者其他任何類型的文件,也不管它體積多大,都有且只有一個(gè)獨(dú)一無二的MD5信息值,并且如果這個(gè)文件被修改過,它的MD5值也將隨之改變。因此,我們可以通過對(duì)比同一文件的MD5值,來校驗(yàn)這個(gè)文件是否被“篡改”過。

MD5介紹 END
登錄注冊(cè)的例子視頻筆記 START

一般來說,防止其要寫的屬性太多,所以這里一般就是set,get一個(gè)bean類。
登錄注冊(cè)的例子視頻筆記? END
struts2框架,action中跳轉(zhuǎn)界面且用EL表達(dá)式獲取傳過來的變量的方法 START

struts2框架,action中跳轉(zhuǎn)界面且用EL表達(dá)式獲取傳過來的變量的方法 END
視頻筆記 END
例子 START
加載下拉框例子 START

package com.jy.action;
import java.util.List;
import com.jy.bean.Addr;
import com.jy.dao.AddrDao;
public class AddrAction {
private String html;
private AddrDao addrDao = new AddrDao();
public String getHtml() {
return html;
}
public void setHtml(String html) {
this.html = html;
}
//http://localhost:8080/J190802/pub/addrAc.action
? ? public String toAddr(){
? ? List<Addr>list = addrDao.selectByPid(0);
? ? StringBuilder sb = new StringBuilder();
? ? for(Addr a : list) {
? ? sb.append("<option value=" + a.getId()?
? ? + ">" + a.getName() + "</option>");
? ? }
? ? html = sb.toString();
? ? return "success";
? ? }
}


package com.jy.bean;
public class Addr {
? ? private Integer id;
? ? private Integer pid;
? ? private String name;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getPid() {
return pid;
}
public void setPid(Integer pid) {
this.pid = pid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}


package com.jy.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import com.jy.bean.Addr;
import com.jy.utils.DbUtil;
public class AddrDao {
? ? public List<Addr>selectByPid(Integer pid){
? ? String sql = "select * from addr where pid = ?";
? ?
? ? Connection conn = null;
? ? PreparedStatement pstm = null;
? ? ResultSet rs = null;
? ? List<Addr>list = new ArrayList<Addr>();
? ? try {
? ? ? ? conn = DbUtil.getConn();
pstm = conn.prepareStatement(sql);
? ? pstm.setInt(1, pid);
? ? rs = pstm.executeQuery();
? ? while(rs.next()) {
? ? Addr a = new Addr();
? ? a.setId(rs.getInt("id"));
? ? a.setPid(rs.getInt("pid"));
? ? a.setName(rs.getString("name"));
? ? list.add(a);
? ? }
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
DbUtil.close(rs, pstm, conn);
}
? ? return list;
? ? }
}


package com.jy.utils;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Properties;
public class DbUtil {
private static String driverName;
? ? private static String url;
? ? private static String user;
? ? private static String pwd;
? ??
? ? static {
? ? //讀取properties文件
? ? Properties prop = new Properties();
? ? //將db.properties文件讀取到內(nèi)存中去
? ? InputStream is = DbUtil.class.getClassLoader()
? ? .getResourceAsStream("db.properties");
? ? //加載內(nèi)容
? ? try {
prop.load(is);
//讀取內(nèi)容
driverName = prop.getProperty("drivername");
url = prop.getProperty("url");
user = prop.getProperty("username");
pwd = prop.getProperty("password");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
? ? }
? ??
? ? //獲取數(shù)據(jù)庫連接對(duì)象的方法
? ? public static Connection getConn(){
? ? Connection conn = null;
? ? try {
Class.forName(driverName);
conn = DriverManager.getConnection(url,user,pwd);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}? ?
? ? return conn;
? ? }
? ??
? ? public static void close(ResultSet rs,PreparedStatement pstm
? ? ,Connection conn){
? ? ? ? try {
? ? ? ? if(rs != null) {
? ? ? ? ? ? rs.close();
? ? ? ? ? ? }
? ? ? ? ? ? if(pstm != null) {
? ? ? ? ? ? pstm.close();
? ? ? ? ? ? }
? ? ? ? ? ? if(conn != null) {
? ? ? ? ? ? conn.close();
? ? ? ? ? ? }
? ? ? ? } catch(Exception e) {
? ? ? ? e.printStackTrace();
? ? ? ? }
? ? }
}


drivername=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/firstjsp?useUnicode=true&characterEncoding=GBK2312
username=root
password=root

<?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="/pub" extends="struts-default">
? ? ? ? ?<action name="loginAc" class="com.jy.action.PubAction"
? ? ? ? ? ? ?method="doLogin">
? ? ? ? ? ? ?<result>/manage.jsp</result>
? ? ? ? ? ? ?<result name="fail">/login.jsp</result>
? ? ? ? ?</action>
? ? ? ? ?
? ? ? ? ?<action name="regAc" class="com.jy.action.PubAction"
? ? ? ? ? ? ?method="doReg">
? ? ? ? ? ? ?<result>/login.jsp</result>
? ? ? ? ? ? ?<result name="fail">/error.jsp</result>
? ? ? ? ?</action>
? ? ? ? ?
? ? ? ? ?<action name="addrAc" class="com.jy.action.AddrAction"
? ? ? ? ? ? ?method="toAddr">
? ? ? ? ? ? ?<result>/addr.jsp</result>
? ? ? ? ?</action>
? ? ?</package>
</struts>

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%
? ? String path = request.getContextPath();
? ? String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
? ? <head>
? ? ? ? <base hreff="<%=basePath%>">
? ? ? ? <title></title>
? ? ? ? <meta http-equiv="pragma" content="no-cache">
? ? ? ? <meta http-equiv="cache-control" content="no-cache">
? ? ? ? <meta http-equiv="expires" content="0">
? ? ? ? <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
? ? ? ? <meta http-equiv="description" content="This is my page">
? ? </head>
? ? <body>
? ? ? ? <label>省份:</label>
? ? ? ? <select id="prov">${html }</select>
? ? </body>
</html>


加載下拉框例子 END
關(guān)于eclipse的卡頓問題,代碼改后未起效問題 START

關(guān)于eclipse的卡頓問題,代碼改后未起效問題 END
登錄注冊(cè) START

package com.jy.action;
import org.apache.struts2.ServletActionContext;
import com.jy.bean.Userinfo;
import com.jy.dao.UserinfoDao;
public class PubAction {
private Userinfo u;
private UserinfoDao userinfoDao = new UserinfoDao();
private String msg;
? ? public Userinfo getU() {
return u;
}
public void setU(Userinfo u) {
this.u = u;
}
public UserinfoDao getUserinfoDao() {
return userinfoDao;
}
public void setUserinfoDao(UserinfoDao userinfoDao) {
this.userinfoDao = userinfoDao;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public String doLogin(){
? ? u = userinfoDao.selectByActAndPwd(u);
? ? if(u.getId() != null) {
? ? //將用戶的賬號(hào)放到session中去
? ? ServletActionContext.getRequest()
? ? ? ? .getSession().setAttribute("_user", u);
? ? return "success";
? ? } else {
? ? msg = "賬號(hào)或者密碼錯(cuò)誤";
? ? return "fail";
? ? }? ?
? ? }
?
public String doReg(){
Integer count = userinfoDao.add(u);
if(count > 0) {
? ? return "success";
} else {
return "fail";
}
}
}


package com.jy.bean;
public class Userinfo {
? ? private Integer id;
? ? private String act;
? ? private String pwd;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getAct() {
return act;
}
public void setAct(String act) {
this.act = act;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
}


package com.jy.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import com.jy.bean.Userinfo;
import com.jy.utils.DbUtil;
public class UserinfoDao {
? ? public Userinfo selectByActAndPwd(Userinfo u){
? ? String sql = "select * from userinfo where act = ? and pwd = ?";
? ?
? ? Connection conn = null;
? ? PreparedStatement pstm = null;
? ? ResultSet rs = null;
? ?
? ? try {
? ? ? ? conn = DbUtil.getConn();
pstm = conn.prepareStatement(sql);
pstm.setString(1, u.getAct());
? ? ? ? ? ? pstm.setString(2, u.getPwd());
? ? ? ? ? ? rs = pstm.executeQuery();
? ? ? ? ? ? if(rs.next()) {
? ? ? ? ? ? Integer id = rs.getInt("id");
? ? ? ? ? ? u.setId(id);
? ? ? ? ? ? }
? ? } catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
DbUtil.close(rs, pstm, conn);
}
? ? return u;
? ? }
? ??
? ? public Integer add(Userinfo u){
? ? return 0;
? ? }
}



<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%
? ? String path = request.getContextPath();
? ? String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
? ? <head>
? ? ? ? <base hreff="<%=basePath%>">
? ? ? ? <title></title>
? ? ? ? <meta http-equiv="pragma" content="no-cache">
? ? ? ? <meta http-equiv="cache-control" content="no-cache">
? ? ? ? <meta http-equiv="expires" content="0">
? ? ? ? <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
? ? ? ? <meta http-equiv="description" content="This is my page">
? ? ? ? <style type="text/css">
? ? ? ? ? ? *{
? ? ? ? ? ? ? ? font-size: 50px;
? ? ? ? ? ? }
? ? ? ? </style>
? ? </head>
? ? <body>
? ? ? ? <form action="pub/loginAc.action" method="post">
? ? ? ? ? ? <table border="1">
? ? ? ? ? ? ? ? <tr>
? ? ? ? ? ? ? ? ? ? <td>賬號(hào):</td>
? ? ? ? ? ? ? ? ? ? <td><input type="text" name="u.act" /></td>
? ? ? ? ? ? ? ? </tr>
? ? ? ? ? ? ? ? <tr>
? ? ? ? ? ? ? ? ? ? <td>密碼:</td>
? ? ? ? ? ? ? ? ? ? <td><input type="password" name="u.pwd" /></td>
? ? ? ? ? ? ? ? </tr>
? ? ? ? ? ? ? ? <tr>
? ? ? ? ? ? ? ? ? ? <td colspan="2" align="center">
? ? ? ? ? ? ? ? ? ? ? ? <input type="submit" value="提交" />
? ? ? ? ? ? ? ? ? ? ? ? <input type="button" value="注冊(cè)" />
? ? ? ? ? ? ? ? ? ? </td>
? ? ? ? ? ? ? ? </tr>
? ? ? ? ? ? </table>
? ? ? ? ? ? <div>${msg }</div>
? ? ? ? </form>
? ? </body>
</html>


<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%
? ? String path = request.getContextPath();
? ? String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
? ? <head>
? ? ? ? <base hreff="<%=basePath%>">
? ? ? ? <title></title>
? ? ? ? <meta http-equiv="pragma" content="no-cache">
? ? ? ? <meta http-equiv="cache-control" content="no-cache">
? ? ? ? <meta http-equiv="expires" content="0">
? ? ? ? <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
? ? ? ? <meta http-equiv="description" content="This is my page">
? ? ? ? <style type="text/css">
? ? ? ? ? ? *{
? ? ? ? ? ? ? ? font-size: 50px;
? ? ? ? ? ? }
? ? ? ? </style>
? ? ? ? <script type="text/javascript">
? ? ? ? ? ? //表單驗(yàn)證
? ? ? ? ? ? function valid(){
? ? ? ? ? ? var flag = true;
? ? ? ? ? ? //賬號(hào)和密碼的長度必須在6到30位之間
? ? ? ? ? ? var act = document.getElementById('act').value;
? ? ? ? ? ? var len = act.length;
? ? ? ? ? ? if(len > 30 || len < 6) {
? ? ? ? ? ? flag = false;
? ? ? ? ? ? alert('賬號(hào)的長度必須在6到30位之間');
? ? ? ? ? ? }
? ? ? ? ? ? //兩次輸入的密碼必須一致? ? ?
? ? ? ? ? ? var pwd = document.getElementById('pwd').value;
? ? ? ? ? ? var cpwd = document.getElementById('cpwd').value;
? ? ? ? ? ? if(pwd !== cpwd) {
? ? ? ? ? ? flag = false;
? ? ? ? ? ? alert('兩次輸入的密碼不一致');
? ? ? ? ? ? }
? ? ? ? ? ? return flag;
? ? ? ? ? ? }
? ? ? ? </script>
? ? </head>
? ? <body>
? ? ? ? <form action="pub/regAc.action" method="post" onsubmit="return valid();">
? ? ? ? ? ? <table border="1">
? ? ? ? ? ? ? ? <tr>
? ? ? ? ? ? ? ? ? ? <td>賬號(hào):</td>
? ? ? ? ? ? ? ? ? ? <td><input type="text" name="u.act" id="act" /></td>
? ? ? ? ? ? ? ? </tr>
? ? ? ? ? ? ? ? <tr>
? ? ? ? ? ? ? ? ? ? <td>密碼:</td>
? ? ? ? ? ? ? ? ? ? <td><input type="password" name="u.pwd" id="pwd" /></td>
? ? ? ? ? ? ? ? </tr>
? ? ? ? ? ? ? ? <tr>
? ? ? ? ? ? ? ? ? ? <td>確認(rèn)密碼:</td>
? ? ? ? ? ? ? ? ? ? <td><input type="password" name="cpwd" id="cpwd"/></td>
? ? ? ? ? ? ? ? </tr>
? ? ? ? ? ? ? ? <tr>
? ? ? ? ? ? ? ? ? ? <td colspan="2" align="center">
? ? ? ? ? ? ? ? ? ? ? ? <input type="submit" value="提交" />
? ? ? ? ? ? ? ? ? ? </td>
? ? ? ? ? ? ? ? </tr>
? ? ? ? ? ? </table>
? ? ? ? </form>
? ? </body>
</html>


登錄時(shí)從jsp界面運(yùn)行,之后表單提交到action的,通過action的路徑運(yùn)行action。




登錄注冊(cè)的SQL代碼:
create table Addr(
id int primary key auto_increment,
pid int,
name? varchar(100)
);
select *? ?from Addr
select * from addr where pid =0
————
create table Userinfo(
id int primary key auto_increment,
act? varchar(100),
pwd? varchar(100)
);
insert into? Userinfo(
act,
pwd ) values("1","1");
select *? ?from Userinfo
drop table Userinfo



登錄注冊(cè)?END
例子 END
作業(yè)和自己給出的答案 START
一:
1、創(chuàng)建一個(gè)Product類,包含pname和price屬性
2、創(chuàng)建一個(gè)商品展示頁面pro.jsp,頁面中有一個(gè)超鏈接顯示為瀏覽商品,當(dāng)點(diǎn)擊這個(gè)超鏈接時(shí)會(huì)跳轉(zhuǎn)到商品詳情頁面detail.jsp。
3、將pro.jsp頁面中的商品名稱和商品價(jià)格傳遞到detail頁面中去并顯示出來,要求使用action實(shí)現(xiàn)。
action運(yùn)行成功的必要條件 START





action運(yùn)行成功的必要條件 END
商品展示和商品詳情的例子 START

create table Product(
pid int primary key auto_increment,
pname? varchar(100),
price double
);
insert into? Product(
pname ,
price) values("sshc","1");
insert into? Product(
pname ,
price) values("sshc2","2");
select *? ?from Product


package Action;
import java.util.List;
import org.apache.struts2.ServletActionContext;
import Bean.Product;
import Dao.ProductDao;
public class DetailAction {
// private Product a = new Product();
// public Product getA() {
// return a;
// }
//
// public void setA(Product a) {
// this.a = a;
// }
private Integer pid;
private Double price;
private String pname;
public Integer getPid() {
return pid;
}
public void setPid(Integer pid) {
this.pid = pid;
}
public Double getPrice() {
return price;
}
public void setPrice(Double price) {
this.price = price;
}
public String getPname() {
return pname;
}
public void setPname(String pname) {
this.pname = pname;
}
? ? public String toDetail(){
? ?
//? ? Product Product = a;
//? ? ServletActionContext.getRequest()
// ? ? .getSession().setAttribute("a", a);
? ? return "success";
? ? }
}


package Action;
import java.util.List;
import Bean.Product;
import Dao.ProductDao;
public class ProductAction {
private String html;
private ProductDao ProductDao = new ProductDao();
public String getHtml() {
return html;
}
public void setHtml(String html) {
this.html = html;
}
public ProductDao getProductDao() {
return ProductDao;
}
public void setProductDao(ProductDao productDao) {
ProductDao = productDao;
}
//http://localhost:8080/STRUTS2homework1/pub/ProductActionName.action
? ? public String toProduct(){
? ? List<Product>list = ProductDao.selectAllProduct();
? ? StringBuilder sb = new StringBuilder();
? ?
? ? sb.append("<table border='1'>"
? ? + "<tr><th>商品編號(hào)</th><th>商品名稱</th>"
? ? + "<th>商品價(jià)格</th><th>瀏覽商品</th></tr>");
? ?
? ? for(Product a : list) {
? ? sb.append("<tr><td>"+
? ? a.getPid()+
? ? "</td><td>"+
? ? a.getPname()
? ? + "</td><td>"+
? ? a.getPrice()
? ? + "</td><td><a href='"
? ? + "pub/DetailActionName.action?"
//? ? + "a="
//? ? +a
? ? + "pid="
? ? +a.getPid()
? ? + "&pname="+a.getPname()
? ? + "&price="+a.getPrice()
? ? + "'>"
? ? + "點(diǎn)擊后瀏覽該商品詳情"
? ? + "</a></td></tr>");
? ? }
? ?
? ? sb.append("</table>");
? ?
? ?
? ? html = sb.toString();
? ? System.out.println("html:"+html);
? ? return "success";
? ? }
}


package Bean;
public class Product {
?
? ? private Integer pid;
? ? private String pname;
? ? private Double price;
public Integer getPid() {
return pid;
}
public void setPid(Integer pid) {
this.pid = pid;
}
public String getPname() {
return pname;
}
public void setPname(String pname) {
this.pname = pname;
}
public Double getPrice() {
return price;
}
public void setPrice(Double price) {
this.price = price;
}
}

package Dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import Utils.DbUtil;
import Bean.Product;
public class ProductDao {
? ? public List<Product>selectAllProduct(){
? ? String sql = "select * from Product";
? ?
? ? Connection conn = null;
? ? PreparedStatement pstm = null;
? ? ResultSet rs = null;
? ? List<Product>list = new ArrayList<Product>();
? ? try {
? ? ? ? conn = DbUtil.getConn();
pstm = conn.prepareStatement(sql);
// ? ? pstm.setInt(1, pid);
? ? rs = pstm.executeQuery();
? ? while(rs.next()) {
? ? Product a = new Product();
? ?
? ? a.setPid(rs.getInt("pid"));
? ? a.setPname(rs.getString("Pname"));
? ? a.setPrice(rs.getDouble("Price"));
? ? list.add(a);
? ? }
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
DbUtil.close(rs, pstm, conn);
}
? ? return list;
? ? }
}


package Utils;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Properties;
public class DbUtil {
private static String driverName;
? ? private static String url;
? ? private static String user;
? ? private static String pwd;
? ??
? ? static {
? ? //讀取properties文件
? ? Properties prop = new Properties();
? ? //將db.properties文件讀取到內(nèi)存中去
? ? InputStream is = DbUtil.class.getClassLoader()
? ? .getResourceAsStream("db.properties");
? ? //加載內(nèi)容
? ? try {
prop.load(is);
//讀取內(nèi)容
driverName = prop.getProperty("drivername");
url = prop.getProperty("url");
user = prop.getProperty("username");
pwd = prop.getProperty("password");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
? ? }
? ??
? ? //獲取數(shù)據(jù)庫連接對(duì)象的方法
? ? public static Connection getConn(){
? ? Connection conn = null;
? ? try {
Class.forName(driverName);
conn = DriverManager.getConnection(url,user,pwd);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}? ?
? ? return conn;
? ? }
? ??
? ? public static void close(ResultSet rs,PreparedStatement pstm
? ? ,Connection conn){
? ? ? ? try {
? ? ? ? if(rs != null) {
? ? ? ? ? ? rs.close();
? ? ? ? ? ? }
? ? ? ? ? ? if(pstm != null) {
? ? ? ? ? ? pstm.close();
? ? ? ? ? ? }
? ? ? ? ? ? if(conn != null) {
? ? ? ? ? ? conn.close();
? ? ? ? ? ? }
? ? ? ? } catch(Exception e) {
? ? ? ? e.printStackTrace();
? ? ? ? }
? ? }
}


drivername=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/firstjsp?useUnicode=true&characterEncoding=GBK2312
username=root
password=root

<?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="SSHC" namespace="/pub" extends="struts-default">
? ? ? ? ?
? ? ? ? ?<action name="ProductActionName" class="Action.ProductAction"
? ? ? ? ? ? ?method="toProduct">
? ? ? ? ? ? ?<result>/pro.jsp</result>
? ? ? ? ?</action>
? ? ? ? ?
? ? ? ? ?
? ? ? ? ?<action name="DetailActionName" class="Action.DetailAction"
? ? ? ? ? ? ?method="toDetail">
? ? ? ? ? ? ?<result>/detail.jsp</result>
? ? ? ? ?</action>?
? ? ? ? ?
? ? ? ??
? ? ?</package>
</struts>


<?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">
? <display-name>STRUTS2homework1</display-name>
? <!-- struts2框架的配置 -->
? <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>
? <welcome-file-list>
? ? <welcome-file>index.html</welcome-file>
? ? <welcome-file>index.htm</welcome-file>
? ? <welcome-file>index.jsp</welcome-file>
? ? <welcome-file>default.html</welcome-file>
? ? <welcome-file>default.htm</welcome-file>
? ? <welcome-file>default.jsp</welcome-file>
? </welcome-file-list>
</web-app>


<%@ 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>
<h1>商品詳情</h1>
商品編號(hào):${pid }
<br>
商品名稱:${pname }
<br>
商品價(jià)格:${price }
</body>
</html>


<%@ 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><h1>商品列表</h1>
${html}
</body>
</html>

啟動(dòng)服務(wù)器后,地址欄輸入http://localhost:8080/STRUTS2homework1/pub/ProductActionName.action后按回車鍵得到的運(yùn)行效果:


商品展示和商品詳情的例子 END
二:
4、創(chuàng)建一個(gè)頁面,將addr表中的所有城市名稱拼接成一個(gè)下拉框
(見上面的拼接下拉框的例子)