TA的每日心情 衰 2021-2-2 11:21
签到天数: 36 天
[LV.5]常住居民I
java 实现微信公众平台开发项目源码
P, P, }: U' J3 Q 本文向大家介绍使用Java来实现微信公共平台功能,实现根据回复的内容返回对应的消息。供大家学习使用。1 c' Y0 x w p1 v1 p
微信服务端收发消息接口:WechatServlet.java
- d: q( e% `7 S/ D. B package demo.servlet;" f7 C$ W/ ^3 D3 ^, K' ]0 h$ J5 g' |
7 D3 J) m$ m8 T2 }
import java.io.BufferedReader;
# r3 M/ i8 j; ^) X1 y0 [! r import java.io.IOException;
7 H. S! g5 K+ \5 Y: k! W& G import java.io.InputStream;
- K# ^8 b( N. g$ l) _ import java.io.InputStreamReader;
8 P! D, J6 \3 K+ l import java.util.Arrays;
6 C& ?' @0 i9 C& S % Z9 k2 Q1 o7 u) x, C
import javax.servlet.ServletException;. P8 N. K9 o) W9 F1 K
import javax.servlet.http.HttpServlet;
" u( x. A1 N2 E4 f import javax.servlet.http.HttpServletRequest;
# o, w; e5 L$ l+ d, q import javax.servlet.http.HttpServletResponse;
$ E# D0 g" o l& s1 V 6 }3 H `0 t4 G- v/ _
import demo.process.WechatProcess;
f+ P: O P* Z% R) g import demo.util.SHA1;' d' x- j+ S. I
/**) Q, J: s! V( N& n% l3 f% x5 s y
* 微信服务端收发消息接口
' w0 u0 }. }7 F2 W *
, z( D- Y9 f2 w * @author 科帮网: Y7 q5 N. c: Q [4 _9 T, S. W5 @/ Q
* " o' R+ I& C6 s0 n% E2 A! c
*/
. {" U3 B, g, x6 [4 b3 N @SuppressWarnings("serial")& U0 h" {6 c) o" j. Q4 w9 y
public class WechatServlet extends HttpServlet {& v0 g0 V6 j) `6 O$ v9 }1 Z
* Q2 |" H" C. C3 V' `1 Z6 Y // 自定义 token
( r% I1 [& b. x5 o9 N private String TOKEN = "52itstyle";
/ O: i7 m0 R+ \5 h public void doGet(HttpServletRequest request, HttpServletResponse response)
+ S9 Q( U2 G) z0 ?: o0 a1 p8 X throws ServletException, IOException {
3 z5 f4 l, A y' } String signature = request.getParameter("signature"); // 随机字符串) Q5 Q8 H. _* s! u- g0 n$ H! |: o
String echostr = request.getParameter("echostr"); // 时间戳
6 e+ {. ~, |& l! ~+ o& b2 K% Z String timestamp = request.getParameter("timestamp"); // 随机数0 ]; e2 M' D& D# m0 l8 s
String nonce = request.getParameter("nonce");, |' Z$ G* H: f
! I+ f- D- d. x3 C# S; Z1 ^ String[] str = { TOKEN, timestamp, nonce };
; N0 I- g3 U7 ]! s- K Arrays.sort(str); // 字典序排序
! P: }) ?$ x- x" _$ F* i String bigStr = str[0] + str[1] + str[2]; // SHA1加密
# J$ h# Q) z/ f/ D8 ` String digest = new SHA1().getDigestOfString(bigStr.getBytes()).toLowerCase();
# |: W0 `! M: Q9 T // 确认请求来至微信
" M( F# M q& S# U: j2 P if (digest.equals(signature)) {8 K$ j m, ?% R" U4 j7 X' ]* V
request.setCharacterEncoding("UTF-8");
" _9 P) @( x C( C/ C* F0 g* C response.setCharacterEncoding("UTF-8");
# s x" c* U1 k 8 E/ c$ v6 t; O" [
/** 读取接收到的xml消息 */
9 K9 E- t7 ~& t3 f9 O" i' d StringBuffer sb = new StringBuffer();
* r1 r( p7 i9 M/ m InputStream is = request.getInputStream();6 `$ l* Y8 u5 B! z& g: t% ^
InputStreamReader isr = new InputStreamReader(is, "UTF-8");9 R) W1 I/ R- u+ Z: Z
BufferedReader br = new BufferedReader(isr);
w' j) L2 M/ l& g* ^ String s = "";: |, |8 P/ P2 d5 z6 m; p5 P, r# `* ]
while ((s = br.readLine()) != null) {9 T1 O# d1 A0 a7 Q, a, }( ~
sb.append(s);' S4 k6 H/ l" @
}4 ]) O6 x9 h8 B) v/ c
String xml = sb.toString(); //次即为接收到微信端发送过来的xml数据
$ V4 T2 t; S: Q$ T1 G # u( z& ?' G$ S% E
String result = "";0 r& v/ b' \) s3 ~: |4 R
/** 判断是否是微信接入激活验证,只有首次接入验证时才会收到echostr参数,此时需要把它直接返回 */' i# `* z; Q' [% {2 Z2 Y
if (echostr != null && echostr.length() > 1) {
- g! _: q1 k1 t. d2 w result = echostr;+ K/ w. ]8 c8 C/ I# t
} else {
: t1 |3 k( @* m0 ?* n //正常的微信处理流程
# h; R1 s( {/ J2 s$ P result = new WechatProcess().processWechatMag(xml);
Y2 C! e" D. k& C }8 {* h$ m3 `! L
System.out.println("说的什么"+result);
( Q( Z8 Z: ~0 ^0 u' z response.getWriter().print(result);6 P8 o$ S3 c1 m8 W, \4 \& g
}
2 x9 z R( x3 \ }
* a7 ?( n( F8 r
. m/ p8 e1 v4 y& } /**
6 Q: o6 d0 P( E * The doPost method of the servlet. <br>
4 O$ }. B6 z! @. B4 a *
& v# }% D+ @3 \3 L * This method is called when a form has its tag value method equals to1 S1 C' _* p X' C- T; I
* post.+ x( g4 ^: g& t X$ W# j" ~
* $ a# K& V% `. n) m) B! a3 |8 G) G: k
* @param request
( H- Y1 o% j3 F: _. o * the request send by the client to the server
3 H5 n; w* e+ F * @param response
; _ ]# C2 s" G+ {0 r * the response send by the server to the client
1 q' G* B% j! n, W5 V * @throws ServletException
: o- a/ ^7 o1 g2 J5 f6 m; w+ K! ` * if an error occurred% Y7 x0 ]/ N J% r7 U; s
* @throws IOException3 M* g; ]" }5 n' x. G }
* if an error occurred- `/ {& U& q3 y# \8 P, C
*/
- H3 |1 q3 g+ G6 J public void doPost(HttpServletRequest request, HttpServletResponse response)
) [+ u# {; L- r7 b- S1 Y throws ServletException, IOException {' N; E& @' D/ W+ v& Y/ u# x) n% c
doGet(request, response);
& [" P5 |2 b, b& u }- j" ~ M, ]: j/ n
' N4 W* Z. y/ \' {4 C" z7 \' c* v }$ ]2 ]$ O6 k$ v7 L
复制代码 接收到的微信xml实体类:ReceiveXmlEntity.java" C6 i1 j3 Y, `2 ~' b, p+ N
package demo.entity;, h; |' M- I0 h G( ^6 y" F
/**7 \. ]+ G4 z: u8 y! `( f$ e% m: |
* 接收到的微信xml实体类
3 T4 O0 A8 z2 g" v# e * @author 科帮网
7 `! p4 q+ ]# Y8 I+ Q6 ]3 U7 L *; T& T9 Q1 y8 u+ J- \7 @5 t3 ?& g
*/) U1 W2 n n1 W# c% M, E* M
public class ReceiveXmlEntity {
" i* v: k" L" a3 {3 ^2 d+ y private String ToUserName="";3 ^+ S. }# V! ~+ n1 f
private String FromUserName="";2 Y$ s6 X3 z9 ]1 m7 _
private String CreateTime="";
- q/ u* A+ O2 u4 D3 u1 }# o private String MsgType="";
% c" j% ^) ~: X private String MsgId="";$ C3 I. Q5 T" w: \' n& b: ]# }4 ?3 {. f3 e
private String Event="";# G5 |% r& F) }0 b; s+ O9 u. F
private String EventKey="";
2 B6 F f' X$ X private String Ticket="";: e& x$ c7 m* R4 P
private String Latitude="";& s6 g! K3 n' @
private String Longitude="";
/ _- r+ ~. S; d- p8 g: ?5 O. q* _0 F private String Precision="";! d% [1 V7 b3 x( ~7 U% d W( j; S
private String PicUrl="";
; F. T2 w6 F8 p" D6 o private String MediaId="";& B) \& W% U! W" s2 J
private String Title="";, t+ T* m. l' Y% Q
private String Description="";0 u* ^1 t+ J3 T
private String Url="";
+ N/ ]9 d/ h1 C$ Z" c( k# x' z' k private String Location_X="";% w5 I `1 v: {! M t
private String Location_Y="";3 A5 d! R4 y6 A+ b
private String Scale="";& e1 K" B/ P" c$ T/ S, p3 f
private String Label="";
' V6 m1 S4 T9 `9 H. ?* | private String Content="";' a/ S' q6 E& Y
private String Format="";
7 Q6 n& `0 I( s) w! N: l, P* ` private String Recognition="";. N' m8 Z# ^! V3 v' ^
6 w5 U* J5 ~+ t7 w
public String getRecognition() {
: t9 }' ~* X) Q9 X return Recognition;
1 x# I3 i( L! g6 Y }+ Z4 ?2 p0 H; W2 q
public void setRecognition(String recognition) {! {% m; |* I' W& l9 S- ~4 b, r* a6 S
Recognition = recognition;
( d- P: G' S! S% E$ ~/ S }
8 D+ X m/ e9 L+ }, D6 e$ N; C public String getFormat() {
8 f5 C X. I$ w9 X return Format;* W+ E: C- S' A7 S4 ?
}
) J+ a) }0 p3 Y4 T9 ~% Y/ D public void setFormat(String format) {/ s- \& f! |3 m" f6 ?! o
Format = format;# P4 N4 t2 S+ J) a
}
) }& q! C/ v3 [0 q. p2 ` public String getContent() {
* I7 _! o' |% C+ T2 K( B: B return Content;
/ v6 n: t2 W9 {' y/ W6 ` }
: a5 n( \5 k8 Y7 h public void setContent(String content) {4 l0 J" e+ e6 N. ^: G5 }9 o
Content = content;' F7 W4 f# c3 [6 W; Q5 a* U4 X
}" X% D2 x- ~! L5 p; o
public String getLocation_X() {
" o y) M5 }) r! S1 T# j return Location_X;
0 ^% u# S" l* w; w* P) F }
: r4 B, H3 t g8 y: ~# C public void setLocation_X(String locationX) {
" y0 n' `5 |# S9 o) _5 x0 C Location_X = locationX;
0 @9 I; U8 {# d' b4 c+ T3 } }
" ^5 E. n& G) a: I6 r- f/ U public String getLocation_Y() {0 q( U, q. @. A4 L! R. c' U$ j: w
return Location_Y;1 p5 k! `4 }9 a$ u# C- [& p
}. U, M, F* Y+ d8 v
public void setLocation_Y(String locationY) {
0 N9 [/ G0 n9 }% n7 A Location_Y = locationY;
* H: B& b2 z% b }2 b4 B3 y9 y- D4 ~7 M- r" o
public String getScale() {
! C* Y: R, F, J8 W- X7 H7 C0 N J# T return Scale;0 b7 b, Y$ b; E ?
}
. l. Z! ]8 p2 ~ public void setScale(String scale) {
7 P- f- n. S4 k- f Scale = scale;
0 l- p0 c* I: c5 P' O) O }" _8 z$ p) Y: z% D3 V5 D
public String getLabel() {
$ C. n2 p1 [; v( p$ \ return Label;2 R; w. J5 _. A( E* o
}
7 f4 T7 a. M0 S3 K% p, y8 G public void setLabel(String label) {5 O! r @" Y* b* Z+ r; U
Label = label;8 r! s: d5 c# b
}
( V/ F& v, E( h. X8 m5 H% z& { public String getTitle() {
+ I2 }* P, A7 z% q. t# O return Title;/ _* b7 w0 ], G$ Z. U8 L3 ^
}5 @3 L+ W! X2 {7 y( z& R: F
public void setTitle(String title) {6 O0 M+ n: w, v- V. D, W- S- a
Title = title;8 u2 K }. R3 W. ] b
}
$ w% V: S& l7 H. }- G7 H( \1 }7 z" c public String getDescription() {
$ @' c! m% |7 n: k+ L return Description;6 I# p+ u4 k4 t0 ?& z* @$ v
}
1 F7 N( {" }+ }: y+ t+ q public void setDescription(String description) {2 u5 g5 n; t; I, d4 ^1 Z2 |
Description = description;) _4 d7 U4 Y! R$ o: o9 G5 U
}
, T& a3 }3 W0 Z, W" L# S public String getUrl() {
6 T* m- k* a7 O7 N return Url;
' m2 L2 E; i2 J& H }! y) O+ ~! P1 E* j6 n% b4 S' O4 ^
public void setUrl(String url) {
9 A9 U& E! Q, j) X f a Url = url;5 o3 v, j8 D+ A: ]
}
. C- s: x6 H. w9 ^ public String getPicUrl() {: P* u- l& R) ~: I
return PicUrl;7 K* z+ I+ l9 A8 R# F: ~6 K1 r
}( m* k/ w- a# W& `! q
public void setPicUrl(String picUrl) {
2 d, G: D0 h1 W; @2 V6 i PicUrl = picUrl;
. S: n$ u3 }8 a( E }
) U W8 Q' M6 V- w' J public String getMediaId() {$ S+ N7 [4 M# G3 p% m* g0 P; H
return MediaId;
1 [/ q, d4 }2 I4 o/ o( ? }
/ k+ D7 M1 c6 ~* Q public void setMediaId(String mediaId) {9 d2 ^, `. S( ^* Z+ a" D
MediaId = mediaId;
" D9 B. S" H" |. x% i+ n( h }
: b0 E$ |' x, K: ]" y public String getEventKey() {3 ~. w2 G, k6 T# T7 S
return EventKey;
; w1 I1 E' U( I/ L7 {; t }( a E: [: l" t- t% E
public void setEventKey(String eventKey) {" S$ J6 F) U5 w1 ?! I- J7 R. R
EventKey = eventKey;9 ^3 a9 n) j& d0 U/ W( a8 R
}6 K- D8 z8 N' C! _" T5 k
public String getTicket() {, u; I/ ~( @% B5 t8 g
return Ticket;
8 o8 q, y4 m7 J% X }
8 _. X( u. n/ G$ t public void setTicket(String ticket) {
$ H% _$ d5 t0 V Ticket = ticket;9 U3 R* h( o A# f5 e* g
}; A- _$ L2 k* w* p( _0 h+ r
public String getLatitude() {
# J5 \7 t' B+ k* p( w" e u return Latitude;
* y3 e; {& L, E& E9 i }2 V [- X, j: s p2 J
public void setLatitude(String latitude) {
8 k# a; T! t( g+ C: H Latitude = latitude;
$ G* m: t1 a3 I- V) j }- V, u5 E5 H# ~, \
public String getLongitude() {3 f d- q% m$ E2 O" b* q
return Longitude;
3 B: ?; M% q. c- {2 d7 D% s h }* m& m" d. v1 E# f- T4 {
public void setLongitude(String longitude) {
% l- u2 Z/ |+ @7 l t Longitude = longitude;1 _2 K- O: v- F* M9 [% j1 g
}
0 M0 y% b3 d) w; ~+ `" {) h# ^ public String getPrecision() {- J$ ^0 e1 e, C$ I6 H
return Precision;
1 |# b4 K; B- h% N } S3 s) @( E* r. X2 V
public void setPrecision(String precision) {/ i. r H' J$ s, p/ ~) \9 \
Precision = precision;
$ T( Y9 u( r' m; ?8 s1 H }/ @0 f' S4 {, B0 o& a/ t2 r8 |
public String getEvent() {: U& m' S" \2 o
return Event;
# z# ]- J& h% ^" z- O; R }
+ a% ^" ~! r5 R. u3 v+ L public void setEvent(String event) {' y) p. u6 g, A& m1 Z u5 H2 m# q; [
Event = event;
, u1 L( z& i H }
; k- I' P/ H) l8 q! f public String getMsgId() {
9 O- O" W1 K3 U* R2 k) l return MsgId;4 A) v2 L' R6 d+ D* Y
}
6 a! b q7 J" C2 x- d. l K public void setMsgId(String msgId) {
g& q/ h% e" z% ?! V3 _; I5 j MsgId = msgId;7 Y; b8 E* v7 c( t8 g& W* S4 C1 ?, B
}
* x- n" V) R' j* f public String getToUserName() {
% J/ K: o4 p# d2 g S return ToUserName;
4 U& i( l- T; ` } L2 I# H# p0 ~4 S9 l% o/ w
public void setToUserName(String toUserName) {* g/ @+ @5 W6 R) Z5 {6 B+ d
ToUserName = toUserName;
; T2 S: {+ u( Y ? }& [4 q' C" L5 X; n
public String getFromUserName() {
2 W& ]! ^- s+ L) H# W0 T0 q/ C4 x% k return FromUserName;) X( {9 q' O: R2 ~9 x, u
}1 |- z% @$ J/ c" f0 y
public void setFromUserName(String fromUserName) {9 p& t; f9 Q+ Y# S- p
FromUserName = fromUserName;1 o$ A& s5 B8 E3 E; O( F9 I- W
}
# h, f' c# Y: K: K1 r& E: n C" h public String getCreateTime() {
- D% s; H6 ^! r; _8 L7 r& D return CreateTime;
, x1 {# s- k2 r. o" r" z: i }; Q- I- ?* R0 A5 g' |
public void setCreateTime(String createTime) {" y# u) ^! Q+ ~9 c* i7 j
CreateTime = createTime;
9 F/ x; }8 |! g" E }% Y+ w _( v& a2 _
public String getMsgType() {3 P5 k" _5 y) c8 b7 {$ [: n
return MsgType;
5 ^9 d- P/ o; E9 O/ i }
' U' f) u: V9 v8 d6 R public void setMsgType(String msgType) {8 u8 `1 W0 Q$ l( k
MsgType = msgType;% x( R& ]) b8 {: r* k% P
} w, G# P, \4 l; i# }+ C
}$ z4 S# A: M7 i, t
复制代码 调用图灵机器人api接口,获取智能回复内容 TulingApiProcess.java, j. ], H, J7 B
4 f( i$ d( F0 z, b U) w# k package demo.process;+ n/ t4 g5 S1 m( n- S% y9 X" F
2 W% v% H# j1 l6 c, H7 s import java.io.IOException;# Q5 W/ H4 S6 [% ?1 i* e3 ^
import java.io.UnsupportedEncodingException;
( t5 ^6 L5 a3 c2 }/ D import java.net.URLEncoder;
2 }6 ~+ }, I# V3 X4 S1 h
, q: z$ x: B7 C import org.apache.http.HttpResponse;" K& d9 q$ j$ |# T/ K
import org.apache.http.client.ClientProtocolException;
6 B5 E$ l. G8 @0 c, M import org.apache.http.client.methods.HttpGet;
/ I) u( O- b5 q S* T# [$ i import org.apache.http.impl.client.HttpClients;2 W3 Y5 ]9 g3 {0 l, G
import org.apache.http.util.EntityUtils;
& `2 F# g V3 q# r import org.json.JSONException;
& G) r$ N1 ~4 t, X6 v' ] import org.json.JSONObject;% r' [3 Y$ \- c" e1 x
3 D$ p H' j$ j' d8 q. F
/**# }6 |8 E3 C, F# |
* 调用图灵机器人api接口,获取智能回复内容
& O$ k' _( w a( ]6 s * @author 科帮网1 J( p& l s! C/ l: h1 V
*
+ ]) X9 g! s: C& c2 l( e) x# C/ ^ */4 }* P7 R1 D& I, q& y+ S0 l. x) U
public class TulingApiProcess {
# o8 [( v( h9 N& w /**
; D. d5 W9 t/ u6 \ * 调用图灵机器人api接口,获取智能回复内容,解析获取自己所需结果) F" K; `+ |. B! T
* @param content; ^$ Z7 Y8 O8 R8 I5 v0 W" H L
* @return
( T _% [2 w( V. B */& n6 x4 R4 E) A _1 S
public String getTulingResult(String content){
/ }1 {( y( T! }7 ~0 @8 l6 O /** 此处为图灵api接口,参数key需要自己去注册申请 */# A- l. z# h( q7 }( d
String apiUrl = "http://www.tuling123.com/openapi/api?key=2a31b2f601f74b54ea13db1c82fe5d71&info=";
7 m. I! f0 H+ v String param = ""; l5 {' e: I( Y
try {
( ^* O; b, |, N param = apiUrl+URLEncoder.encode(content,"utf-8");
# \! q C- Z3 L" y$ Z8 g } catch (UnsupportedEncodingException e1) {
) U; o: t/ ~1 j; F1 K e1.printStackTrace();
# I0 m0 g% r, D: J, u } //将参数转为url编码
- J- P: V$ H" B% t* M9 ~/ F0 |! K /** 发送httpget请求 */
: G+ g6 q' }! W3 S5 | HttpGet request = new HttpGet(param);
+ k. B" y" M, U `$ B3 F String result = "";
5 N) W+ i, K+ J; R" l v& n try {7 H8 z: }9 l3 ~: H+ A9 `
HttpResponse response = HttpClients.createDefault().execute(request);( l, B0 q# J* U/ A
if(response.getStatusLine().getStatusCode()==200){
- l( G {8 F( m. K) a' B |& V result = EntityUtils.toString(response.getEntity());
3 a4 n" E- ^8 o6 S$ E3 p+ F }7 f s. t9 h& b+ W9 v8 U8 w! N
} catch (ClientProtocolException e) {: M3 O" V2 r; I a2 X
e.printStackTrace();5 n3 x4 I1 z7 Q
} catch (IOException e) {
( f' h6 l/ v3 T& \6 g e.printStackTrace();) h7 N3 E" s; b" w, R
}, r" A$ d+ C( }! V4 z% j8 {8 b! k4 H
/** 请求失败处理 *// p# S. q5 }4 o3 n* u' o
if(null==result){8 [3 Z. P( v+ E3 _/ i Z
return "对不起,你说的话真是太高深了……";5 M: H8 M* @0 |* x: q' d
}
/ d& v3 A% i7 L7 X$ I 4 M; M- t c. G2 i0 O
try {3 l$ A) M9 r: v6 }3 x! k
JSONObject json = new JSONObject(result);
- }2 |6 E' I* m ^0 f* | //以code=100000为例,参考图灵机器人api文档
6 F# ]3 s0 N8 u5 K' i1 _ if(100000==json.getInt("code")){7 ]( y# m/ h* l7 V
result = json.getString("text");
9 o. m, G/ Z- D( m }- d( @7 C7 K* w' M& h) i/ ?
} catch (JSONException e) { O) {: [" O2 L! x5 M: z
e.printStackTrace();$ u5 N" @: ]# P2 _% c A" m
}' T) p5 L$ h9 ]
return result;8 U. y4 ^9 o' w; D
}0 B' g$ x) V' H4 J
}, R9 d* T7 A8 ^# q/ Z1 e( y% ~% Z
复制代码
3 n3 v, A2 B/ C web.xml 配置:
; n0 ]0 Y: F0 c <?xml version="1.0" encoding="UTF-8"?>
7 v" y* E9 Z# o+ D) T ^, Z( s <web-app version="2.5" 4 e. B, D6 D2 J
xmlns="http://java.sun.com/xml/ns/javaee" ( n" ^' r: ?& ?( D7 K7 g( C8 P
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
. G" _" [2 q$ j) j/ Q! C0 g xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
. i. m! C( E' U+ l http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"># D8 @! z6 N: C x. p0 N) M
<servlet>$ z$ Q# U8 k& ]6 i: K
<servlet-name>WechatServlet</servlet-name>
# k2 `% G5 {5 w <servlet-class>demo.servlet.WechatServlet</servlet-class>, A% [/ D/ b8 E' q
</servlet>6 H7 X B |" D, V _
. T# s6 v( f7 P
<servlet-mapping>- z% r( G0 M* {5 O9 P3 r+ G
<servlet-name>WechatServlet</servlet-name>) ~9 P) C6 [- X: ]# ]
<url-pattern>/wechat.do</url-pattern>2 X* e, [5 K( ?& J5 p
</servlet-mapping>2 t; s7 I/ E2 |' U* J5 b H( ~
<welcome-file-list>8 @6 Q' A8 v6 a3 J
<welcome-file>index.jsp</welcome-file>
! G" j6 c+ c9 ~2 I+ o! [ </welcome-file-list>
9 o7 @; }# s* h </web-app>
T, ]% p: G: o9 X5 n3 {* N6 A 复制代码
5 n2 z% a8 o( w" i 项目源码下载地址:/ O( x3 w3 Z( T7 j1 x$ ~
/ U6 B, C1 f6 w" n, c
7 n7 X% e; S$ U4 K
科帮网-Java论坛、Java社区、JavaWeb毕业设计 1、本主题所有言论和图片纯属会员个人意见,与本社区立场无关2、本站所有主题由该帖子作者发表,该帖子作者与科帮网-Java论坛、Java社区、JavaWeb毕业设计 享有帖子相关版权3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和科帮网-Java论坛、Java社区、JavaWeb毕业设计 的同意4、帖子作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任5、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责6、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意7、科帮网-Java论坛、Java社区、JavaWeb毕业设计 管理员和版主有权不事先通知发贴者而删除本文
JAVA爱好者①群:
JAVA爱好者②群:
JAVA爱好者③ :