From 497947fd4be84bfd31e7a1f64ee9fe58703d1f54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=98=93=E4=BF=8A=E5=BC=9B?= <1484245902@qq.com> Date: Sun, 27 Nov 2022 21:00:23 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...质展示第一次迭代uml顺序图.png | Bin 0 -> 22402 bytes ...质展示第二次迭代uml顺序图.png | Bin 0 -> 51626 bytes ...质预警第一次迭代uml顺序图.png | Bin 0 -> 27426 bytes ...质预警第二次迭代uml顺序图.png | Bin 0 -> 21814 bytes ...00340036 易俊弛-实践总结报告.docx | Bin 0 -> 13527 bytes src/src_houduan/dao/UserDao.java | 47 +++ .../dao/WaterQualityStationDao.java | 29 ++ src/src_houduan/dao/impl/UserDaoImpl.java | 180 +++++++++ .../dao/impl/WaterQualityStationDaoImpl.java | 352 ++++++++++++++++++ src/src_houduan/service/UserService.java | 76 ++++ .../service/WaterQualityStationService.java | 27 ++ .../service/impl/UserServiceImpl.java | 110 ++++++ .../impl/WaterQualityStationServiceImpl.java | 132 +++++++ .../web/servlet/user/AddUserServlet.java | 46 +++ .../web/servlet/user/DelSelectedServlet.java | 31 ++ .../web/servlet/user/DelUserServlet.java | 31 ++ .../servlet/user/FindUserByPageServlet.java | 56 +++ .../web/servlet/user/FindUserServlet.java | 34 ++ .../web/servlet/user/LoginServlet.java | 82 ++++ .../web/servlet/user/LogoutServlet.java | 27 ++ .../web/servlet/user/RegisterServlet.java | 39 ++ .../servlet/user/UpdatePasswordServlet.java | 50 +++ .../servlet/user/UpdateUserInfoServlet.java | 74 ++++ .../web/servlet/user/UpdateUserServlet.java | 47 +++ .../web/servlet/user/UserListServlet.java | 31 ++ .../AddWaterQualityDataServlet.java | 67 ++++ .../ConditionalQueryStationByPageServlet.java | 63 ++++ .../DeleteStationServlet.java | 55 +++ .../FindAlllStationServlet.java | 35 ++ .../FindByNameAndTimeServlet.java | 60 +++ .../FindByPageServlet.java | 65 ++++ .../waterQualityStation/FindIntroServlet.java | 38 ++ .../FindLocationByNameServlet.java | 36 ++ .../FindPollutedSiteServlet.java | 39 ++ .../FindSimIntroServlet.java | 55 +++ .../FindStationAndQualityServlet.java | 52 +++ .../waterQualityStation/IndexingServlet.java | 39 ++ .../UpdateStationInfoServlet.java | 70 ++++ 38 files changed, 2175 insertions(+) create mode 100644 model/水质展示第一次迭代uml顺序图.png create mode 100644 model/水质展示第二次迭代uml顺序图.png create mode 100644 model/水质预警第一次迭代uml顺序图.png create mode 100644 model/水质预警第二次迭代uml顺序图.png create mode 100644 other/200340036 易俊弛-实践总结报告.docx create mode 100644 src/src_houduan/dao/UserDao.java create mode 100644 src/src_houduan/dao/WaterQualityStationDao.java create mode 100644 src/src_houduan/dao/impl/UserDaoImpl.java create mode 100644 src/src_houduan/dao/impl/WaterQualityStationDaoImpl.java create mode 100644 src/src_houduan/service/UserService.java create mode 100644 src/src_houduan/service/WaterQualityStationService.java create mode 100644 src/src_houduan/service/impl/UserServiceImpl.java create mode 100644 src/src_houduan/service/impl/WaterQualityStationServiceImpl.java create mode 100644 src/src_houduan/web/servlet/user/AddUserServlet.java create mode 100644 src/src_houduan/web/servlet/user/DelSelectedServlet.java create mode 100644 src/src_houduan/web/servlet/user/DelUserServlet.java create mode 100644 src/src_houduan/web/servlet/user/FindUserByPageServlet.java create mode 100644 src/src_houduan/web/servlet/user/FindUserServlet.java create mode 100644 src/src_houduan/web/servlet/user/LoginServlet.java create mode 100644 src/src_houduan/web/servlet/user/LogoutServlet.java create mode 100644 src/src_houduan/web/servlet/user/RegisterServlet.java create mode 100644 src/src_houduan/web/servlet/user/UpdatePasswordServlet.java create mode 100644 src/src_houduan/web/servlet/user/UpdateUserInfoServlet.java create mode 100644 src/src_houduan/web/servlet/user/UpdateUserServlet.java create mode 100644 src/src_houduan/web/servlet/user/UserListServlet.java create mode 100644 src/src_houduan/web/servlet/waterQualityStation/AddWaterQualityDataServlet.java create mode 100644 src/src_houduan/web/servlet/waterQualityStation/ConditionalQueryStationByPageServlet.java create mode 100644 src/src_houduan/web/servlet/waterQualityStation/DeleteStationServlet.java create mode 100644 src/src_houduan/web/servlet/waterQualityStation/FindAlllStationServlet.java create mode 100644 src/src_houduan/web/servlet/waterQualityStation/FindByNameAndTimeServlet.java create mode 100644 src/src_houduan/web/servlet/waterQualityStation/FindByPageServlet.java create mode 100644 src/src_houduan/web/servlet/waterQualityStation/FindIntroServlet.java create mode 100644 src/src_houduan/web/servlet/waterQualityStation/FindLocationByNameServlet.java create mode 100644 src/src_houduan/web/servlet/waterQualityStation/FindPollutedSiteServlet.java create mode 100644 src/src_houduan/web/servlet/waterQualityStation/FindSimIntroServlet.java create mode 100644 src/src_houduan/web/servlet/waterQualityStation/FindStationAndQualityServlet.java create mode 100644 src/src_houduan/web/servlet/waterQualityStation/IndexingServlet.java create mode 100644 src/src_houduan/web/servlet/waterQualityStation/UpdateStationInfoServlet.java diff --git a/model/水质展示第一次迭代uml顺序图.png b/model/水质展示第一次迭代uml顺序图.png new file mode 100644 index 0000000000000000000000000000000000000000..9c894071ea05c39302bb2e29cea2b3b4a759497b GIT binary patch literal 22402 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�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 u(6^P-WWO zI~z+W@y+4_0s>OUj{bg9KtKp3Ah3!mx&|0IMBZ`__#qg2($ZX@tW#+ccv$Uo==dQ4 zf%0UDB~M}CSuFVI=}-Xy=@$Nf!PcO{vjPHsm}9>mIt2$)h`#7(GFTy89PIr2Z;vZQ zk%wNj!0qO)UJCXUy6R;3eB4c=+1dMauc+1?_})XBc4dbo#pOkjGMi|hQ*?6jn?$eEHCVBB;Vq=MJp#eT;@@m>WP z*nerJdp2r=fEn7VYH6DbN*#jD!@otYZm@bW8lCA+CGh7k1S<62?$*B9<+ux z9HC*42mtGTU>V4Pg%BipU@Msh@?acSainH>D-+!<3FFOQ`15uFR=>12v zJNlX;&OqII$RA9a7;w|lmUmruX@7LP$pHi9`el=0!Py@ovDtl|lcZztC+Ewq00aG- z@pDFow!x-gTQYi%z72a)5B~xf@V^0#RDPgdqk<|3b7n=X1Mkd$o&g4`U+Fgh)Vd|( zdyMvQOyuRjh%W`Pk-S5wh3P5Y+mlBDqW(sMz0N2j2DH$_1kG&)fjO!!;*o0 z+&4r7j)&tmVH`n79N1ua;RkyHLGFuoX{?cw5h915F8+nb;r&)Xdc7t zXi4YOpNTLfj!=U(*kQ7J-*xp&w2*nT7;Y1{3PDBbC;N?tq)FTIR>^}=O#*jH2fpaX zAfhS|)QNDO|JeRf`Ra2}Q~|ius+k<-H#!IK-#{6R_{42xs&aJ@MG^1i^O2;TgkH$Q z+~6>A2j5XfEFvnDBUm7~%~f|&pIB^VOZIIh_qcv!rE^T-Q8DGx4q;l&E9{5JHi5X&bT(uzfs4nJ-aW@oMj6Z6LZm zVZ>&kB$Y^fNq)^7t)aND11HA>WrIw+OX}UZ74!Az8{4ihuZ0@(7~*I?8E^DWom2gK zp_m9FjNDn9aj|h?i1Kk zJt$Kc)*C(*!RkUBZ^+*C%1(w)^8k%ii}=#UCSm7C&@-_KG`|Gk_zlXiDjQ(L3r$XN?X4r$Q@!gPfZWP5rWv3F&)I!r>(;i%QC%(BzTEDB6(p^P80}sg8 z-<{?6l}{3=nfWF48N{ptqBcU$CJnU5GNNpLRjIgR+3QcuP(4lKKd%EU8aX{-9@0?? z%1$vG*@;aL6QP*Ey2H=Jw|<{ujmmaN;UC0AxI{DQf%v{M%lCCti-k7ch+_&nY>ks53!mT{Iuh_WE^dj)fh<@d zDkA0#Jr~g`f6dNmy{*%x23j0~UUfj-(vPpH4ihIIa*!mDWDZjd_9kt;3iVlRnX}O; zO%1}hGb=P7q=#XO!mOP|WG=Fkj?>Hv9f5^3OR>KSvd>G`LSXR3)2=06*c zrv{9TQ@MNvwiY}xX=)b2E5@;)9eF--eR6%4o7TT;EkxYy$6fn!@n>CbugzKc%25>z zp`S(s@^~@y%nVEX+CGK8w)vfpWqM-UgK31>>_2~4o}C`>*-+<&BPTH(*ue9&55Z#t)* z9`5fmHFBSSUD_f{6G2Y&Jz?A4x7i;z>Z^S^MV51oB)U4lIYk5>b+(JU zR#GTL=yQ< zBEWBjtDl~3AJsRueFumfFmwuy37jLiq3#O@u|*@sjA_G=d^%~)HP16 zO|EW1&0PhX*ZCdZZ`ap_A-us{6j1PUrMvlfA4BYT40sjo_ROieccr#O+07S){O6*T zz?tRtY{MwJ#~l`{G6l@6UJK5X7(c0K!km41Oa~CCSHcEM4>T{ld9JHj)Zl%@?;5TA z3E`;>0Qh`Pr{EO# z)fD0Avf~$XwPpU90zcK?nxwj*cwG$9)?~8&-9KvhQ}bC)qgC*K=H;&gcdZ5Qw^eih z$H2xL;cv(neEf0ye-cCV>;R(Lc{Fu@%=ip8Nqeeux6VJ)*gzN?t~)VK8D4Wz7>&ecgaoR0#`G4wwuJ;*5sTWCU`6IC$*2 z949U`%|*jRz}`OU(!0W_9@iK+1##BU5QwUy885AlOHjkRyi?)=?2g7AC^S9j`@Uf^ z;NuAPW^WP@vI_Jah6BkCkJ$wN!v@=59};iOcEFx1y;pgtH#IzWRUBovDsg>U{Giai zBgD*Xnz&-#tyQ6RE6d7(J-ybS^pN(GvD+LL6xqDn|GK$&`yqW{w(!IoCw{Ci zFAt6(Xm9_CA~6(NM|`KYNR^1jjk^7&qw)qv)PyG<&I>#_!OU03Howw%{GE;jr~Zw< zkO4%zAI12w{vLp)fAWCVXXX9})bo>MzWd~&{8`Y5U=@@bOr3f#?k>djaxdxDrE-I4TA0l zq-L}8gIM|Jj-$ap4zK~pMd2H$VQekl7p))_)Aouz5>}6X78b?k-LAR+cLRV7UJye` z@lz}wwF&qnzEq;!nxPi_>*c(6v`USi;@Oi*8t{z{J19pqA35wpBeK1<^kZW z+qPp3_`2iL_&PAaoBw&|-n*me%0DhRz=CJ;KNxSy=gEI%U;~arz%}sRX>s0hQey^E zy$Oi<`r+Ni4FNcYE3UUh>_epF$7Mw+$0r!NwyZaq)1OR4ymX3w8Bb`98EUQVj8pfN z67EoDQnqcp!7gEV5sI;&>{eq@KvFC1n#p_7 zcRnA-d0UW4U{7?*R}vcgJEx(}tsmly3U4|*Ys@5YVz6#h_{~XIXIoviz8LEHx=k+x zzfzJNZkHpLm-;xDtTw7I+6Ixd4HNBHgQ^}kSjW2K3X}g5IPcVkYWT2;m08AnS6<2t z@h>zJrbW8$@12c!p|vXMX1BcPuQU4DArMhLtDBG_59{4U{Zdy=1UpL-Vqa&ytw#A+ z%r@;bM1Dvk_dGT2$?9)S!0W(%w}9eZJ0K|CX(x4BD^B3EFujdU?c8m*F5Yn2P$l4B z*-K6pYp*vyDIcv8!rZ%|Z>@0cH5gcCO55m6{qYZEk&YdPt!mS7%ktPVibYi^6j@b% zNKXotDs3HB)47{755cdMB1nv-xMLGyv=T?%N4Hlb;KvN^2Eð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 Q->^_lTQHkT9Q>324PL^wqW}N^ literal 0 HcmV?d00001 diff --git a/model/水质预警第二次迭代uml顺序图.png b/model/水质预警第二次迭代uml顺序图.png new file mode 100644 index 0000000000000000000000000000000000000000..ab0c36df4fb55cb9b093d34050a3d43432b44285 GIT binary patch literal 21814 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 findAll(); + + User findUserByUsernameAndPassword(String username, String password); + + void add(User user); + void register(User user); + void updatePassword(User user); + + void delete(int id); + + User findById(int i); + + void update(User user); + + /** + * 查询总记录数 + * @return + * @param condition + */ + int findTotalCount(Map condition); + + /** + * 分页查询每页记录 + * @param start + * @param rows + * @param condition + * @return + */ + List findByPage(int start, int rows, Map condition); + + boolean updateUserInfo(User user); +} diff --git a/src/src_houduan/dao/WaterQualityStationDao.java b/src/src_houduan/dao/WaterQualityStationDao.java new file mode 100644 index 0000000..d0a7d65 --- /dev/null +++ b/src/src_houduan/dao/WaterQualityStationDao.java @@ -0,0 +1,29 @@ +package dao; + + +import domain.StationAndQuality; +import domain.WaterQualityStation; + +import java.util.List; +import java.util.Map; + +public interface WaterQualityStationDao +{ + public abstract List findAll(); + public abstract WaterQualityStation findByName(String stationName); + public abstract WaterQualityStation findIntroByName(String name); + public abstract boolean addWaterQualityStation(WaterQualityStation station); + public abstract List findByPage(int start,int pageSize); + public abstract int findTotalCount(); + public abstract WaterQualityStation findIntroById(int id); + public abstract List conditonalQueryByPage(int start, int pageSize, Map condition); + public abstract int conditionalFindAllCount(Map condition); + public abstract boolean update(WaterQualityStation station); + public abstract boolean delete(int id); + public abstract List findPollutedSite(); + public abstract WaterQualityStation findIntro(double longitude,double latitude); + + public abstract StationAndQuality findStationAndQuality(double longitude,double latitude); + + public abstract List indexing(); +} diff --git a/src/src_houduan/dao/impl/UserDaoImpl.java b/src/src_houduan/dao/impl/UserDaoImpl.java new file mode 100644 index 0000000..7eef482 --- /dev/null +++ b/src/src_houduan/dao/impl/UserDaoImpl.java @@ -0,0 +1,180 @@ +package dao.impl; + + +import domain.User; +import org.springframework.dao.DataAccessException; +import util.JDBCUtils; +import dao.UserDao; +import org.springframework.jdbc.core.BeanPropertyRowMapper; +import org.springframework.jdbc.core.JdbcTemplate; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Set; +import domain.User; + +public class UserDaoImpl implements UserDao { + + private JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource()); + + @Override + public List findAll() { + //使用JDBC操作数据库... + //1.定义sql + String sql = "select * from user"; + List users = template.query(sql, new BeanPropertyRowMapper(User.class)); + + return users; + } + + @Override + public User findUserByUsernameAndPassword(String username, String password) { + try { + String sql = "select * from user where username = ? and password = ?"; + User user = template.queryForObject(sql, new BeanPropertyRowMapper(User.class), username, password); + return user; + } catch (Exception e) { + System.out.println(e); + return null; + } + + } + + @Override + public void add(User user) { + //1.定义sql + String sql = "insert into user values(null,?,?,?,?,?,?,null,null)"; + //2.执行sql + template.update(sql, user.getName(), user.getGender(), user.getAge(), user.getAddress(), user.getQq(), user.getEmail()); + } + + @Override + public void register(User user)//用户注册 + { + String sql="insert into user (id,age,username,password) values(null,?,?,?)"; + template.update(sql,18,user.getUsername(),user.getPassword()); + + } + + @Override + public void updatePassword(User user)//修改当前用户密码 + { + String sql="update user set password=? where username=?"; + template.update(sql,user.getPassword(),user.getUsername()); + } + + @Override + public void delete(int id) { + //1.定义sql + String sql = "delete from user where id = ?"; + //2.执行sql + template.update(sql, id); + } + + @Override + public User findById(int id) { + String sql = "select * from user where id = ?"; + return template.queryForObject(sql, new BeanPropertyRowMapper(User.class), id); + } + + @Override + public void update(User user) { + String sql = "update user set name = ?,gender = ? ,age = ? , address = ? , qq = ?, email = ? where id = ?"; + template.update(sql, user.getName(), user.getGender(), user.getAge(), user.getAddress(), user.getQq(), user.getEmail(), user.getId()); + } + + @Override + public int findTotalCount(Map condition) { + //1.定义模板初始化sql + String sql = "select count(*) from user where 1 = 1 "; + StringBuilder sb = new StringBuilder(sql); + //2.遍历map + Set keySet = condition.keySet(); + //定义参数的集合 + List params = new ArrayList(); + for (String key : keySet) { + + //排除分页条件参数 + if("currentPage".equals(key) || "rows".equals(key)){ + continue; + } + + //获取value + String value = condition.get(key)[0]; + //判断value是否有值 + if(value != null && !"".equals(value)){ + //有值 + sb.append(" and "+key+" like ? "); + params.add("%"+value+"%");//?条件的值 + } + } + System.out.println(sb.toString()); + System.out.println(params); + + return template.queryForObject(sb.toString(),Integer.class,params.toArray()); + } + + @Override + public List findByPage(int start, int rows, Map condition) { + String sql = "select * from user where 1 = 1 "; + + StringBuilder sb = new StringBuilder(sql); + //2.遍历map + Set keySet = condition.keySet(); + //定义参数的集合 + List params = new ArrayList(); + for (String key : keySet) + { + + //排除分页条件参数 + if("currentPage".equals(key) || "rows".equals(key)) + { + continue; + } + + //获取value + String value = condition.get(key)[0]; + //判断value是否有值 + if(value != null && !"".equals(value)) + { + //有值 + sb.append(" and "+key+" like ? "); + params.add("%"+value+"%");//?条件的值 + } + } + + //添加分页查询 + sb.append(" limit ?,? "); + //添加分页查询参数值 + params.add(start); + params.add(rows); + sql = sb.toString(); + System.out.println(sql); + System.out.println(params); + + return template.query(sql,new BeanPropertyRowMapper(User.class),params.toArray()); + } + + @Override + public boolean updateUserInfo(User user) + { + int update=0; + try { + String sql="update user set name = ?,gender = ? ,age = ? , address = ? , qq = ?, email = ? where id = ?"; + update = template.update(sql, user.getName(), user.getGender(), user.getAge(), + user.getAddress(), user.getQq(), user.getEmail(), user.getId()); + } catch (Exception e) + { + System.out.println(e); + } + if(update!=0) + { + return true; + } + else + { + return false; + } + } +} diff --git a/src/src_houduan/dao/impl/WaterQualityStationDaoImpl.java b/src/src_houduan/dao/impl/WaterQualityStationDaoImpl.java new file mode 100644 index 0000000..9f707d7 --- /dev/null +++ b/src/src_houduan/dao/impl/WaterQualityStationDaoImpl.java @@ -0,0 +1,352 @@ +package dao.impl; + +import dao.WaterQualityStationDao; +import domain.StationAndQuality; +import domain.WaterQuality; +import domain.WaterQualityStation; +import org.springframework.dao.DataAccessException; +import org.springframework.jdbc.core.BeanPropertyRowMapper; +import org.springframework.jdbc.core.JdbcTemplate; +import util.JDBCUtils; + +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + +public class WaterQualityStationDaoImpl implements WaterQualityStationDao +{ + private JdbcTemplate template=new JdbcTemplate(JDBCUtils.getDataSource()); + + @Override + public List findAll() + { + //定义sql + String sql="select * from water_quality_station"; + //执行sql + List station = template.query(sql, new BeanPropertyRowMapper(WaterQualityStation.class)); + return station; + } + + @Override + public WaterQualityStation findByName(String stationName) + { + WaterQualityStation station = null; + try + { + String sql="select * from water_quality_station where stationName=?"; + station = template.queryForObject(sql, new BeanPropertyRowMapper(WaterQualityStation.class), stationName); + } catch (DataAccessException e) + { + System.out.println(e); + } + return station; + } + + @Override + public WaterQualityStation findIntroByName(String name) { + String sql="select * from water_quality_station where stationName=?"; + WaterQualityStation waterQualityStation = template.queryForObject(sql, new BeanPropertyRowMapper(WaterQualityStation.class),name); + return waterQualityStation; + } + + @Override + public boolean addWaterQualityStation(WaterQualityStation station) + { + int update = 0; + try { + String sql="insert into water_quality_station values(null,?,?,?,?,?)"; + update = template.update(sql,station.getStationName(),station.getLongitude(),station.getLatitude(),station.getSection(),station.getIntroduction()); + } catch (DataAccessException e) { + System.out.println(e);; + } + System.out.println(update); + if(update!=0) + { + return true; + } + else + { + return false; + } + + + } + + @Override + public List findByPage(int start, int pageSize) + { + List list=null; + try { + String sql="select * from water_quality_station limit ?,?"; + list = template.query(sql, + new BeanPropertyRowMapper(WaterQualityStation.class), start, pageSize); + } catch (DataAccessException e) { + System.out.println(e); + } + + return list; + } + + @Override + public int findTotalCount() + { + String sql="select count(*) from water_quality_station"; + Integer integer = template.queryForObject(sql, Integer.class); + return integer; + } + + @Override + public WaterQualityStation findIntroById(int id) + { + WaterQualityStation station = null; + try { + String sql="select * from water_quality_station where id=?"; + station = template.queryForObject(sql, new BeanPropertyRowMapper(WaterQualityStation.class), id); + } catch (DataAccessException e) { + System.out.println(e); + } + return station; + } + + @Override + public List conditonalQueryByPage(int start, int pageSize, Map condition) + { + StringBuilder builder=new StringBuilder();//代表整个sql语句 + String starStr="select * from water_quality_station where 1=1 "; + builder.append(starStr); + + List valueList=new ArrayList<>(); + + //遍历map集合 + for(String key:condition.keySet()) + { + + //排除分页条件参数 + if("currentPage".equals(key) || "pageSize".equals(key)) + { + continue; + } + + + String value = condition.get(key)[0]; + if(value!=null&&!"".equals(value)) + { + builder.append(" and "+key+" like ? "); + valueList.add("%"+value+"%"); + + } + } + + + builder.append(" limit ?,? "); + valueList.add(start); + valueList.add(pageSize); + String sql = builder.toString(); + + System.out.println(sql); + System.out.println(valueList); + + //执行sql + List objList = null; + try { + objList = template.query(sql, new BeanPropertyRowMapper(WaterQualityStation.class), valueList.toArray()); + } catch (DataAccessException e) { + System.out.println(e); + } + + return objList; + } + + @Override + public int conditionalFindAllCount(Map condition) + { + StringBuilder builder=new StringBuilder();//代表整个sql语句 + String starStr="select count(*) from water_quality_station where 1=1 "; + builder.append(starStr); + + List valueList=new ArrayList<>(); + + //遍历map集合 + for(String key:condition.keySet()) + { + + //排除分页条件参数 + if("currentPage".equals(key) || "pageSize".equals(key)) + { + continue; + } + + + String value = condition.get(key)[0]; + if(value!=null&&!"".equals(value)) + { + builder.append(" and "+key+" like ? "); + valueList.add("%"+value+"%"); + + } + } + String sql = builder.toString(); + System.out.println(sql); + System.out.println(valueList); + + int integer = 0; + try { + integer = template.queryForObject(sql, Integer.class, valueList.toArray()); + } catch (DataAccessException e) + { + System.out.println(e); + } + + + return integer; + } + + @Override + public boolean update(WaterQualityStation station) + { + int update=0; + try { + String sql="update water_quality_station set stationName=?,longitude=?,latitude=?,section=?,introduction=? where id=?"; + update = template.update(sql, + station.getStationName(), + station.getLongitude(), + station.getLatitude(), + station.getSection(), + station.getIntroduction(), + station.getId()); + } catch (DataAccessException e) { + System.out.println(e); + } + if(update!=0) + { + return true; + } + else + { + return false; + } + } + + @Override + public boolean delete(int id) + { + int update=0; + try { + String sql="delete from water_quality_station where id=?"; + update = template.update(sql, id); + } catch (DataAccessException e) + { + System.out.println(e); + } + if(update!=0) + { + return true; + } + else + { + return false; + } + + } + + @Override + public List findPollutedSite() + { + List list=null; + try + { + String sql="SELECT * FROM water_quality_station WHERE stationName IN\n" + + "(SELECT DISTINCT belongStation FROM water_quality WHERE (LEVEL='Ⅳ' OR LEVEL='Ⅴ' OR LEVEL='劣Ⅴ') \n" + + "AND TO_DAYS(NOW())-TO_DAYS(DATETIME)<=1)"; + list = template.query(sql, new BeanPropertyRowMapper(WaterQualityStation.class)); + } catch (Exception e) + { + System.out.println(e); + } + return list; + } + + @Override + public WaterQualityStation findIntro(double longitude, double latitude) + { + WaterQualityStation station= null; + try { + String sql="SELECT * FROM water_quality_station WHERE ABS(longitude-?)<0.1 AND ABS(latitude-?)<0.1;"; + List list = template.query(sql, new BeanPropertyRowMapper(WaterQualityStation.class), longitude, latitude); + if(list!=null) + {station = list.get(0);} + } catch (Exception e) { + System.out.println(e); + } + return station; + } + + @Override + public StationAndQuality findStationAndQuality(double longitude, double latitude) + { + StationAndQuality stationAndQuality= null; + try { + String sql1="SELECT * FROM water_quality_station WHERE ABS(longitude-?)<0.1 AND ABS(latitude-?)<0.1"; + String sql2="SELECT * FROM water_quality WHERE belongStation IN\n" + + " (SELECT stationName FROM water_quality_station WHERE ABS(longitude-?)<0.1 AND ABS(latitude-?)<0.1)\n" + + " ORDER BY DATETIME DESC LIMIT 1;"; + List list = template.query(sql1, new BeanPropertyRowMapper(WaterQualityStation.class),longitude,latitude); + + WaterQualityStation station=null; + if(list.size()!=0&&list!=null) + { + station=list.get(0); + } + + List list2 = template.query(sql2, new BeanPropertyRowMapper(WaterQuality.class), longitude, latitude); + + WaterQuality waterQuality=null; + if(list2!=null&&list2.size()!=0) + { + waterQuality=list2.get(0); + } + + stationAndQuality = new StationAndQuality(); + if(list!=null&&list2!=null) + { + stationAndQuality.setStation(station); + stationAndQuality.setQuality(waterQuality); + } + + } catch (Exception e) { + System.out.println(e); + } + return stationAndQuality; + } + + @Override + public List indexing() + { + List result=new LinkedList<>(); + String sql="select * from water_quality_station"; + List stationList = template.query(sql, new BeanPropertyRowMapper(WaterQualityStation.class)); + for (WaterQualityStation station : stationList) + { + String stationName = station.getStationName(); + String sql2="SELECT * FROM water_quality WHERE belongStation=? ORDER BY DATETIME DESC LIMIT 1"; + List qualityList = null; + try { + qualityList = template.query(sql2, new BeanPropertyRowMapper(WaterQuality.class),stationName); + } catch (Exception e) + { + System.out.println(e); + } + + WaterQuality waterQuality=null; + if(qualityList!=null&&qualityList.size()!=0) + {waterQuality = qualityList.get(0);} + + StationAndQuality stationAndQuality=new StationAndQuality(); + stationAndQuality.setStation(station); + stationAndQuality.setQuality(waterQuality); + result.add(stationAndQuality); + } + return result; + } +} diff --git a/src/src_houduan/service/UserService.java b/src/src_houduan/service/UserService.java new file mode 100644 index 0000000..0a7634e --- /dev/null +++ b/src/src_houduan/service/UserService.java @@ -0,0 +1,76 @@ +package service; + + +import domain.User; +import domain.PageBean; + +import java.util.List; +import java.util.Map; + +/** + * 用户管理的业务接口 + */ +public interface UserService { + + /** + * 查询所有用户信息 + * @return + */ + public List findAll(); + + /** + * 登录方法 + * @param user + * @return + */ + User login(User user); + + /** + * 保存User + * @param user + */ + void addUser(User user); + + + void userRegister(User user);//用户注册 + + void updateUserPassword(User user); + + + /** + * 根据id删除User + * @param id + */ + void deleteUser(String id); + + /** + * 根据id查询 + * @param id + * @return + */ + User findUserById(String id); + + /** + * 修改用户信息 + * @param user + */ + void updateUser(User user); + + /** + * 批量删除用户 + * @param ids + */ + void delSelectedUser(String[] ids); + + /** + * 分页条件查询 + * @param currentPage + * @param rows + * @param condition + * @return + */ + PageBean findUserByPage(String currentPage, String rows, Map condition); + + + boolean updateUserInfo(User user); +} diff --git a/src/src_houduan/service/WaterQualityStationService.java b/src/src_houduan/service/WaterQualityStationService.java new file mode 100644 index 0000000..137f4cb --- /dev/null +++ b/src/src_houduan/service/WaterQualityStationService.java @@ -0,0 +1,27 @@ +package service; + +import domain.PageBean; +import domain.StationAndQuality; +import domain.WaterQualityStation; + +import java.util.List; +import java.util.Map; + +public interface WaterQualityStationService +{ + public abstract List findAll(); + public abstract WaterQualityStation findByName(String stationName); + public abstract int findTotalCount(); + public abstract WaterQualityStation findIntroByName(String name); + public abstract boolean addWaterQualityStation(WaterQualityStation station); + public abstract PageBean getPageBean(int currentPage,int pageSize); + public abstract WaterQualityStation findIntroById(int id); + public abstract PageBean conditonalQueryByPage(int currentPage, int pageSize, Map condition); + public abstract int conditionalFindAllCount(Map condition); + public abstract boolean update(WaterQualityStation station); + public abstract boolean delete(int id); + public abstract List findPollutedSite(); + public abstract WaterQualityStation findIntro(double longitude,double latitude); + public abstract StationAndQuality findStationAndQuality(double longitude, double latitude); + public abstract List indexing(); +} diff --git a/src/src_houduan/service/impl/UserServiceImpl.java b/src/src_houduan/service/impl/UserServiceImpl.java new file mode 100644 index 0000000..2e52c74 --- /dev/null +++ b/src/src_houduan/service/impl/UserServiceImpl.java @@ -0,0 +1,110 @@ +package service.impl; + + + +import domain.User; +import dao.UserDao; +import dao.impl.UserDaoImpl; +import domain.PageBean; +import service.UserService; + +import java.util.List; +import java.util.Map; + +public class UserServiceImpl implements UserService { + private UserDao dao = new UserDaoImpl(); + + @Override + public List findAll() { + //调用Dao完成查询 + return dao.findAll(); + } + + @Override + public User login(User user) { + return dao.findUserByUsernameAndPassword(user.getUsername(),user.getPassword()); + } + + @Override + public void addUser(User user) { + dao.add(user); + } + + @Override + public void userRegister(User user) { + dao.register(user); + } + + @Override + public void updateUserPassword(User user)//修改当前用户密码 + { + dao.updatePassword(user); + + } + + @Override + public void deleteUser(String id) { + dao.delete(Integer.parseInt(id)); + } + + @Override + public User findUserById(String id) { + return dao.findById(Integer.parseInt(id)); + } + + @Override + public void updateUser(User user) { + dao.update(user); + } + + @Override + public void delSelectedUser(String[] ids) { + if(ids != null && ids.length > 0){ + //1.遍历数组 + for (String id : ids) { + //2.调用dao删除 + dao.delete(Integer.parseInt(id)); + } + } + + } + + @Override + public PageBean findUserByPage(String _currentPage, String _rows, Map condition) { + + int currentPage = Integer.parseInt(_currentPage); + int rows = Integer.parseInt(_rows); + + if(currentPage <=0) { + currentPage = 1; + } + //1.创建空的PageBean对象 + PageBean pb = new PageBean(); + //2.设置参数 + pb.setCurrentPage(currentPage); + pb.setRows(rows); + + //3.调用dao查询总记录数 + int totalCount = dao.findTotalCount(condition); + pb.setTotalCount(totalCount); + //4.调用dao查询List集合 + //计算开始的记录索引 + int start = (currentPage - 1) * rows; + List list = dao.findByPage(start,rows,condition); + pb.setList(list); + + //5.计算总页码 + int totalPage = (totalCount % rows) == 0 ? totalCount/rows : (totalCount/rows) + 1; + pb.setTotalPage(totalPage); + + + return pb; + } + + @Override + public boolean updateUserInfo(User user) + { + boolean b = dao.updateUserInfo(user); + return b; + } +} diff --git a/src/src_houduan/service/impl/WaterQualityStationServiceImpl.java b/src/src_houduan/service/impl/WaterQualityStationServiceImpl.java new file mode 100644 index 0000000..43fe6d6 --- /dev/null +++ b/src/src_houduan/service/impl/WaterQualityStationServiceImpl.java @@ -0,0 +1,132 @@ +package service.impl; + +import dao.WaterQualityStationDao; +import dao.impl.WaterQualityStationDaoImpl; +import domain.PageBean; +import domain.StationAndQuality; +import domain.WaterQualityStation; +import service.WaterQualityStationService; + +import java.util.List; +import java.util.Map; + +public class WaterQualityStationServiceImpl implements WaterQualityStationService +{ + WaterQualityStationDao dao=new WaterQualityStationDaoImpl(); + + @Override + public List findAll() + { + return dao.findAll(); + } + + @Override + public WaterQualityStation findByName(String stationName) + { + return dao.findByName(stationName); + } + + /** + * 查询所有水质监测站 + * @return + */ + @Override + public int findTotalCount() + { + int totalCount = dao.findTotalCount(); + return totalCount; + } + + @Override + public WaterQualityStation findIntroByName(String name) { + return dao.findIntroByName(name); + } + + @Override + public boolean addWaterQualityStation(WaterQualityStation station) + { + return dao.addWaterQualityStation(station); + + } + + @Override + public PageBean getPageBean(int currentPage, int pageSize) + { + PageBean pageBean=new PageBean<>(); + int totalCount=dao.findTotalCount(); + pageBean.setTotalCount(totalCount); + int totalPage=totalCount%pageSize==0?totalCount/pageSize:(totalCount/pageSize+1); + pageBean.setTotalPage(totalPage); + pageBean.setCurrentPage(currentPage); + pageBean.setRows(pageSize); + int start=(currentPage-1)*pageSize; + List list = dao.findByPage(start, pageSize); + pageBean.setList(list); + return pageBean; + } + + @Override + public WaterQualityStation findIntroById(int id) + { + WaterQualityStation introById = dao.findIntroById(id); + return introById; + } + + @Override + public PageBean conditonalQueryByPage(int currentPage, int pageSize, Map condition) + { + PageBean pageBean=new PageBean<>(); + int totalCount= dao.conditionalFindAllCount(condition); + pageBean.setTotalCount(totalCount); + int totalPage=totalCount%pageSize==0?totalCount/pageSize:(totalCount/pageSize+1); + pageBean.setTotalPage(totalPage); + pageBean.setCurrentPage(currentPage); + pageBean.setRows(pageSize); + List list = dao.conditonalQueryByPage((currentPage - 1) * pageSize, pageSize, condition); + pageBean.setList(list); + return pageBean; + } + + @Override + public int conditionalFindAllCount(Map condition) + { + int i = dao.conditionalFindAllCount(condition); + return i; + } + + @Override + public boolean update(WaterQualityStation station) + { + boolean b = dao.update(station); + return b; + } + + @Override + public boolean delete(int id) + { + boolean b = dao.delete(id); + return b; + } + + @Override + public List findPollutedSite() + { + return dao.findPollutedSite(); + } + + @Override + public WaterQualityStation findIntro(double longitude, double latitude) { + return dao.findIntro(longitude,latitude); + } + + @Override + public StationAndQuality findStationAndQuality(double longitude, double latitude) { + return dao.findStationAndQuality(longitude,latitude); + } + + @Override + public List indexing() + { + return dao.indexing(); + } +} diff --git a/src/src_houduan/web/servlet/user/AddUserServlet.java b/src/src_houduan/web/servlet/user/AddUserServlet.java new file mode 100644 index 0000000..0f03862 --- /dev/null +++ b/src/src_houduan/web/servlet/user/AddUserServlet.java @@ -0,0 +1,46 @@ +package web.servlet.user; + + +import domain.User; +import org.apache.commons.beanutils.BeanUtils; +import service.UserService; +import service.impl.UserServiceImpl; + +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.util.Map; + +@WebServlet("/addUserServlet") +public class AddUserServlet extends HttpServlet { + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + //1.设置编码 + request.setCharacterEncoding("utf-8"); + //2.获取参数 + Map map = request.getParameterMap(); + //3.封装对象 + User user = new User(); + try { + BeanUtils.populate(user,map); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } + + //4.调用Service保存 + UserService service = new UserServiceImpl(); + service.addUser(user); + + //5.跳转到userListServlet + response.sendRedirect(request.getContextPath()+"/userListServlet"); + } + + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + this.doPost(request, response); + } +} diff --git a/src/src_houduan/web/servlet/user/DelSelectedServlet.java b/src/src_houduan/web/servlet/user/DelSelectedServlet.java new file mode 100644 index 0000000..de44997 --- /dev/null +++ b/src/src_houduan/web/servlet/user/DelSelectedServlet.java @@ -0,0 +1,31 @@ +package web.servlet.user; + + + +import service.UserService; +import service.impl.UserServiceImpl; + +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +@WebServlet("/delSelectedServlet") +public class DelSelectedServlet extends HttpServlet { + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + //1.获取所有id + String[] ids = request.getParameterValues("uid"); + //2.调用service删除 + UserService service = new UserServiceImpl(); + service.delSelectedUser(ids); + + //3.跳转查询所有Servlet + response.sendRedirect(request.getContextPath()+"/userListServlet"); + } + + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + this.doPost(request, response); + } +} diff --git a/src/src_houduan/web/servlet/user/DelUserServlet.java b/src/src_houduan/web/servlet/user/DelUserServlet.java new file mode 100644 index 0000000..792356b --- /dev/null +++ b/src/src_houduan/web/servlet/user/DelUserServlet.java @@ -0,0 +1,31 @@ +package web.servlet.user; + + + +import service.UserService; +import service.impl.UserServiceImpl; + +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +@WebServlet("/delUserServlet") +public class DelUserServlet extends HttpServlet { + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + //1.获取id + String id = request.getParameter("id"); + //2.调用service删除 + UserService service = new UserServiceImpl(); + service.deleteUser(id); + + //3.跳转到查询所有Servlet + response.sendRedirect(request.getContextPath()+"/userListServlet"); + } + + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + this.doPost(request, response); + } +} diff --git a/src/src_houduan/web/servlet/user/FindUserByPageServlet.java b/src/src_houduan/web/servlet/user/FindUserByPageServlet.java new file mode 100644 index 0000000..f0d3862 --- /dev/null +++ b/src/src_houduan/web/servlet/user/FindUserByPageServlet.java @@ -0,0 +1,56 @@ +package web.servlet.user; + + + +import domain.User; +import domain.PageBean; +import service.UserService; +import service.impl.UserServiceImpl; + +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.Map; + +@WebServlet("/findUserByPageServlet") +public class FindUserByPageServlet extends HttpServlet { + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + request.setCharacterEncoding("utf-8"); + + //1.获取参数 + String currentPage = request.getParameter("currentPage");//当前页码 + String rows = request.getParameter("rows");//每页显示条数 + + if(currentPage == null || "".equals(currentPage)){ + + currentPage = "1"; + } + + if(rows == null || "".equals(rows)){ + rows = "5"; + } + + //获取条件查询参数 + Map condition = request.getParameterMap(); + + + //2.调用service查询 + UserService service = new UserServiceImpl(); + PageBean pb = service.findUserByPage(currentPage,rows,condition); + + System.out.println(pb); + + //3.将PageBean存入request + request.setAttribute("pb",pb); + request.setAttribute("condition",condition);//将查询条件存入request + //4.转发到list.jsp + request.getRequestDispatcher("/list.jsp").forward(request,response); + } + + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + this.doPost(request, response); + } +} diff --git a/src/src_houduan/web/servlet/user/FindUserServlet.java b/src/src_houduan/web/servlet/user/FindUserServlet.java new file mode 100644 index 0000000..336fa3e --- /dev/null +++ b/src/src_houduan/web/servlet/user/FindUserServlet.java @@ -0,0 +1,34 @@ +package web.servlet.user; + + + +import domain.User; +import service.UserService; +import service.impl.UserServiceImpl; + +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +@WebServlet("/findUserServlet") +public class FindUserServlet extends HttpServlet { + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + //1.获取id + String id = request.getParameter("id"); + //2.调用Service查询 + UserService service = new UserServiceImpl(); + User user = service.findUserById(id); + + //3.将user存入request + request.setAttribute("user",user); + //4.转发到update.jsp + request.getRequestDispatcher("/update.jsp").forward(request,response); + } + + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + this.doPost(request, response); + } +} diff --git a/src/src_houduan/web/servlet/user/LoginServlet.java b/src/src_houduan/web/servlet/user/LoginServlet.java new file mode 100644 index 0000000..04a37a6 --- /dev/null +++ b/src/src_houduan/web/servlet/user/LoginServlet.java @@ -0,0 +1,82 @@ +package web.servlet.user; + + +import domain.User; +import org.apache.commons.beanutils.BeanUtils; +import service.UserService; +import service.impl.UserServiceImpl; + +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.util.Map; + +@WebServlet("/loginServlet") +public class LoginServlet extends HttpServlet { + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + //1.设置编码 + request.setCharacterEncoding("utf-8"); + + //2.获取数据 + //2.1获取用户填写验证码 + String verifycode = request.getParameter("verifycode"); + + //3.验证码校验 + HttpSession session = request.getSession(); + String checkcode_server = (String) session.getAttribute("CHECKCODE_SERVER"); + session.removeAttribute("CHECKCODE_SERVER");//确保验证码一次性 + if(!checkcode_server.equalsIgnoreCase(verifycode)){ + //验证码不正确 + //提示信息 + request.setAttribute("login_msg","验证码错误!"); + //跳转登录页面 + request.getRequestDispatcher("/login.jsp").forward(request,response); + + return; + } + + Map map = request.getParameterMap(); + //4.封装User对象 + User user = new User(); + try { + BeanUtils.populate(user,map); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } + + + //5.调用Service查询 + UserService service = new UserServiceImpl(); + User loginUser = service.login(user); + //6.判断是否登录成功 + if(loginUser != null){ + //登录成功 + //将用户存入session + session.setAttribute("user",loginUser); + //跳转页面 + response.sendRedirect(request.getContextPath()+"/index.jsp"); + }else{ + //登录失败 + //提示信息 + request.setAttribute("login_msg","用户名或密码错误!"); + //跳转登录页面 + request.getRequestDispatcher("/login.jsp").forward(request,response); + + } + + + + + } + + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + this.doPost(request, response); + } +} diff --git a/src/src_houduan/web/servlet/user/LogoutServlet.java b/src/src_houduan/web/servlet/user/LogoutServlet.java new file mode 100644 index 0000000..8eef145 --- /dev/null +++ b/src/src_houduan/web/servlet/user/LogoutServlet.java @@ -0,0 +1,27 @@ +package web.servlet.user; + +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; +import java.io.IOException; + +@WebServlet("/LogoutServlet") +public class LogoutServlet extends HttpServlet +{ + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException + { + HttpSession session = request.getSession(); + session.removeAttribute("user"); + response.sendRedirect(request.getContextPath()+"/login.jsp"); + } + + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException + { + + this.doPost(request, response); + + } +} diff --git a/src/src_houduan/web/servlet/user/RegisterServlet.java b/src/src_houduan/web/servlet/user/RegisterServlet.java new file mode 100644 index 0000000..59854ea --- /dev/null +++ b/src/src_houduan/web/servlet/user/RegisterServlet.java @@ -0,0 +1,39 @@ +package web.servlet.user; + +import domain.User; +import service.impl.UserServiceImpl; + +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +@WebServlet("/RegisterServlet") +public class RegisterServlet extends HttpServlet +{ + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException + { + request.setCharacterEncoding("utf-8"); + String username = request.getParameter("username"); + String password = request.getParameter("password"); + User registerUser=new User(); + registerUser.setUsername(username); + registerUser.setPassword(password); + + + UserServiceImpl service=new UserServiceImpl(); + service.userRegister(registerUser); + + request.setAttribute("register_msg","注册成功!"); + request.getRequestDispatcher("/register.jsp").forward(request,response); + } + + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException + { + + this.doPost(request, response); + + } +} diff --git a/src/src_houduan/web/servlet/user/UpdatePasswordServlet.java b/src/src_houduan/web/servlet/user/UpdatePasswordServlet.java new file mode 100644 index 0000000..111a904 --- /dev/null +++ b/src/src_houduan/web/servlet/user/UpdatePasswordServlet.java @@ -0,0 +1,50 @@ +package web.servlet.user; + +import com.fasterxml.jackson.databind.ObjectMapper; +import domain.ResultInfo; +import domain.User; +import service.impl.UserServiceImpl; + +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; +import java.io.IOException; + +@WebServlet("/UpdatePasswordServlet") +public class UpdatePasswordServlet extends HttpServlet +{ + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException + { + String username = request.getParameter("username"); + String newPassword = request.getParameter("newPassword"); + + User user=new User(); + user.setUsername(username); + user.setPassword(newPassword); + + UserServiceImpl service=new UserServiceImpl(); + service.updateUserPassword(user); + + HttpSession session = request.getSession(); + session.removeAttribute("user"); + + ResultInfo info=new ResultInfo(); + info.setMsg("密码修改成功!"); + + ObjectMapper mapper=new ObjectMapper(); + response.setContentType("application/json;charset=utf-8"); + mapper.writeValue(response.getOutputStream(),info); + + + } + + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException + { + + this.doPost(request, response); + + } +} diff --git a/src/src_houduan/web/servlet/user/UpdateUserInfoServlet.java b/src/src_houduan/web/servlet/user/UpdateUserInfoServlet.java new file mode 100644 index 0000000..3705749 --- /dev/null +++ b/src/src_houduan/web/servlet/user/UpdateUserInfoServlet.java @@ -0,0 +1,74 @@ +package web.servlet.user; + +import com.fasterxml.jackson.databind.ObjectMapper; +import domain.ResultInfo; +import domain.User; +import service.UserService; +import service.impl.UserServiceImpl; + +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * @author laoyingyong + * @date: 2020-01-22 19:01 + */ +@WebServlet("/UpdateUserInfoServlet") +public class UpdateUserInfoServlet extends HttpServlet +{ + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException + { + String id = request.getParameter("id"); + String name = request.getParameter("name"); + String gender = request.getParameter("gender"); + String age = request.getParameter("age"); + String address = request.getParameter("address"); + String qq = request.getParameter("qq"); + String email = request.getParameter("email"); + + + User user=new User(); + try + { + user.setId(Integer.parseInt(id)); + user.setName(name); + user.setGender(gender); + user.setAge(Integer.parseInt(age)); + user.setAddress(address); + user.setQq(qq); + user.setEmail(email); + } catch (Exception e) + { + System.out.println(e); + } + + + UserService service=new UserServiceImpl(); + boolean b = service.updateUserInfo(user); + ResultInfo info=new ResultInfo(); + if(b) + { + info.setMsg("修改成功,下次登录后即可查看更新!"); + } + else + { + info.setMsg("修改失败!"); + } + + ObjectMapper mapper=new ObjectMapper(); + response.setContentType("application/json;charset=utf8"); + mapper.writeValue(response.getOutputStream(),info); + + } + + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException + { + + this.doPost(request, response); + + } +} diff --git a/src/src_houduan/web/servlet/user/UpdateUserServlet.java b/src/src_houduan/web/servlet/user/UpdateUserServlet.java new file mode 100644 index 0000000..ac1a0c1 --- /dev/null +++ b/src/src_houduan/web/servlet/user/UpdateUserServlet.java @@ -0,0 +1,47 @@ +package web.servlet.user; + +import domain.User; +import org.apache.commons.beanutils.BeanUtils; +import service.UserService; +import service.impl.UserServiceImpl; + +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.util.Map; + +@WebServlet("/updateUserServlet") +public class UpdateUserServlet extends HttpServlet { + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + //1.设置编码 + request.setCharacterEncoding("utf-8"); + //2.获取map + Map map = request.getParameterMap(); + //3.封装对象 + User user = new User(); + try { + BeanUtils.populate(user,map); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } + + //4.调用Service修改 + UserService service = new UserServiceImpl(); + service.updateUser(user); + + //5.跳转到查询所有Servlet + response.sendRedirect(request.getContextPath()+"/userListServlet"); + } + + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException + { + + this.doPost(request, response); + } +} diff --git a/src/src_houduan/web/servlet/user/UserListServlet.java b/src/src_houduan/web/servlet/user/UserListServlet.java new file mode 100644 index 0000000..6a50891 --- /dev/null +++ b/src/src_houduan/web/servlet/user/UserListServlet.java @@ -0,0 +1,31 @@ +package web.servlet.user; + + +import domain.User; +import service.UserService; +import service.impl.UserServiceImpl; + +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.List; + +@WebServlet("/userListServlet") +public class UserListServlet extends HttpServlet { + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + //1.调用UserService完成查询 + UserService service = new UserServiceImpl(); + List users = service.findAll(); + //2.将list存入request域 + request.setAttribute("users",users); + //3.转发到list.jsp + request.getRequestDispatcher("/list.jsp").forward(request,response); + } + + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + this.doPost(request, response); + } +} diff --git a/src/src_houduan/web/servlet/waterQualityStation/AddWaterQualityDataServlet.java b/src/src_houduan/web/servlet/waterQualityStation/AddWaterQualityDataServlet.java new file mode 100644 index 0000000..4c83c55 --- /dev/null +++ b/src/src_houduan/web/servlet/waterQualityStation/AddWaterQualityDataServlet.java @@ -0,0 +1,67 @@ +package web.servlet.waterQualityStation; + +import com.fasterxml.jackson.databind.ObjectMapper; +import domain.ResultInfo; +import domain.WaterQualityStation; +import service.WaterQualityStationService; +import service.impl.WaterQualityStationServiceImpl; + +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +@WebServlet("/AddWaterQualityDataServlet") +public class AddWaterQualityDataServlet extends HttpServlet +{ + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException + { + request.setCharacterEncoding("utf-8"); + String stationName = request.getParameter("stationName"); + String longitude = request.getParameter("longitude"); + String latitude = request.getParameter("latitude"); + String section = request.getParameter("section"); + String introduction = request.getParameter("introduction"); + WaterQualityStation station=new WaterQualityStation(); + //封装对象 + try + { + station.setStationName(stationName); + station.setLongitude(Double.parseDouble(longitude)); + station.setLatitude(Double.parseDouble(latitude)); + station.setSection(section); + station.setIntroduction(introduction); + } catch (NumberFormatException e) + { + System.out.println(e); + } + + WaterQualityStationService service=new WaterQualityStationServiceImpl(); + boolean flag = service.addWaterQualityStation(station); + + ResultInfo info=new ResultInfo(); + if(flag) + { + info.setMsg("添加成功!"); + } + else + { + info.setMsg("添加失败,监测站点名已存在!"); + } + + ObjectMapper mapper=new ObjectMapper(); + response.setContentType("application/json;charset=utf-8"); + System.out.println(info); + String string = mapper.writeValueAsString(info); + response.getWriter().write(string); + } + + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException + { + + this.doPost(request, response); + + } +} diff --git a/src/src_houduan/web/servlet/waterQualityStation/ConditionalQueryStationByPageServlet.java b/src/src_houduan/web/servlet/waterQualityStation/ConditionalQueryStationByPageServlet.java new file mode 100644 index 0000000..d6102e9 --- /dev/null +++ b/src/src_houduan/web/servlet/waterQualityStation/ConditionalQueryStationByPageServlet.java @@ -0,0 +1,63 @@ +package web.servlet.waterQualityStation; + +import com.fasterxml.jackson.databind.ObjectMapper; +import domain.PageBean; +import domain.WaterQualityStation; +import service.WaterQualityStationService; +import service.impl.WaterQualityStationServiceImpl; + + +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.Map; + +@WebServlet("/ConditionalQueryStationByPageServlet") +public class ConditionalQueryStationByPageServlet extends HttpServlet +{ + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException + { + request.setCharacterEncoding("utf-8"); + WaterQualityStationService service=new WaterQualityStationServiceImpl(); + Map parameterMap = request.getParameterMap(); + int totalCount = service.conditionalFindAllCount(parameterMap); //总的记录数 + + String currentPage = request.getParameter("currentPage"); + String pageSize = request.getParameter("pageSize"); + int intCurrentPage = 1; + int intPageSize = 5; + try { + intCurrentPage = Integer.parseInt(currentPage); + intPageSize = Integer.parseInt(pageSize); + } catch (NumberFormatException e) { + System.out.println(e); + } + int totalPage=totalCount%intPageSize==0?totalCount/intPageSize:(totalCount/intPageSize+1); + if(intCurrentPage<=0) + { + intCurrentPage=1; + } + if(intCurrentPage>totalPage) + { + intCurrentPage=totalPage; + + } + + PageBean bean = service.conditonalQueryByPage(intCurrentPage, intPageSize, parameterMap); + ObjectMapper mapper=new ObjectMapper(); + response.setContentType("application/json;chartset=utf-8"); + System.out.println(bean); + mapper.writeValue(response.getOutputStream(),bean); + + } + + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException + { + + this.doPost(request, response); + + } +} diff --git a/src/src_houduan/web/servlet/waterQualityStation/DeleteStationServlet.java b/src/src_houduan/web/servlet/waterQualityStation/DeleteStationServlet.java new file mode 100644 index 0000000..1055d7c --- /dev/null +++ b/src/src_houduan/web/servlet/waterQualityStation/DeleteStationServlet.java @@ -0,0 +1,55 @@ +package web.servlet.waterQualityStation; + +import com.fasterxml.jackson.databind.ObjectMapper; +import domain.ResultInfo; +import domain.WaterQualityStation; +import service.WaterQualityStationService; +import service.impl.WaterQualityStationServiceImpl; + +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +@WebServlet("/DeleteStationServlet") +public class DeleteStationServlet extends HttpServlet +{ + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException + { + String id = request.getParameter("id"); + + int i=0; + try + { + i = Integer.parseInt(id); + } catch (NumberFormatException e) + { + System.out.println(e); + } + + WaterQualityStationService service=new WaterQualityStationServiceImpl(); + boolean flag = service.delete(i); + ResultInfo info=new ResultInfo(); + if(flag) + { + info.setMsg("删除成功!"); + } + else + { + info.setMsg("删除失败!"); + } + ObjectMapper mapper=new ObjectMapper(); + response.setContentType("application/json;charset=utf-8"); + mapper.writeValue(response.getOutputStream(),info); + + } + + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException + { + + this.doPost(request, response); + + } +} diff --git a/src/src_houduan/web/servlet/waterQualityStation/FindAlllStationServlet.java b/src/src_houduan/web/servlet/waterQualityStation/FindAlllStationServlet.java new file mode 100644 index 0000000..6c60b51 --- /dev/null +++ b/src/src_houduan/web/servlet/waterQualityStation/FindAlllStationServlet.java @@ -0,0 +1,35 @@ +package web.servlet.waterQualityStation; + +import com.fasterxml.jackson.databind.ObjectMapper; +import domain.WaterQualityStation; +import service.WaterQualityStationService; +import service.impl.WaterQualityStationServiceImpl; + +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.List; + +@WebServlet("/FindAlllStationServlet") +public class FindAlllStationServlet extends HttpServlet +{ + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException + { + WaterQualityStationService service=new WaterQualityStationServiceImpl(); + List list = service.findAll(); + ObjectMapper mapper=new ObjectMapper(); + response.setContentType("application/json;charset=utf-8"); + mapper.writeValue(response.getOutputStream(),list); + + } + + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException + { + + this.doPost(request, response); + + } +} diff --git a/src/src_houduan/web/servlet/waterQualityStation/FindByNameAndTimeServlet.java b/src/src_houduan/web/servlet/waterQualityStation/FindByNameAndTimeServlet.java new file mode 100644 index 0000000..97ee060 --- /dev/null +++ b/src/src_houduan/web/servlet/waterQualityStation/FindByNameAndTimeServlet.java @@ -0,0 +1,60 @@ +package web.servlet.waterQualityStation; + +import com.fasterxml.jackson.databind.ObjectMapper; +import domain.WaterQuality; +import service.WaterQualityService; +import service.impl.WaterQualityServiceImpl; + +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.List; + +/** + * @author laoyingyong + * @date: 2020-02-03 23:11 + */ +@WebServlet("/FindByNameAndTimeServlet") +public class FindByNameAndTimeServlet extends HttpServlet +{ + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException + { + String name = request.getParameter("cezhanName"); + System.out.println(name); + String star = request.getParameter("startTime"); + String startTime=null; + if(star!=null) + { + startTime=star.replace("T"," ")+":00"; + System.out.println("开始时间"+startTime); + } + String end = request.getParameter("endTime"); + String endTime=null; + if(end!=null) + { + endTime=end.replace("T"," ")+":00"; + System.out.println("结束时间"+endTime); + } + String water_level = request.getParameter("water_level"); + System.out.println("level:"+water_level); + + + WaterQualityService service=new WaterQualityServiceImpl(); + List byNameAndTime = service.findByNameAndTime(name, startTime, endTime,water_level); + System.out.println(byNameAndTime); + ObjectMapper mapper=new ObjectMapper(); + response.setContentType("application/json;chartset=utf-8"); + mapper.writeValue(response.getOutputStream(),byNameAndTime); + + } + + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException + { + + this.doPost(request, response); + + } +} diff --git a/src/src_houduan/web/servlet/waterQualityStation/FindByPageServlet.java b/src/src_houduan/web/servlet/waterQualityStation/FindByPageServlet.java new file mode 100644 index 0000000..01fadd9 --- /dev/null +++ b/src/src_houduan/web/servlet/waterQualityStation/FindByPageServlet.java @@ -0,0 +1,65 @@ +package web.servlet.waterQualityStation; + +import com.fasterxml.jackson.databind.ObjectMapper; +import domain.PageBean; +import domain.WaterQualityStation; +import org.springframework.dao.DataAccessException; +import org.springframework.jdbc.core.BeanPropertyRowMapper; +import org.springframework.jdbc.core.JdbcTemplate; +import service.WaterQualityStationService; +import service.impl.WaterQualityStationServiceImpl; +import util.JDBCUtils; + +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; +import java.io.IOException; +import java.util.List; + +@WebServlet("/FindByPageServlet") +public class FindByPageServlet extends HttpServlet +{ + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException + { + WaterQualityStationService service=new WaterQualityStationServiceImpl(); + int totalCount = service.findTotalCount();//总记录数 + + String currentPage = request.getParameter("currentPage"); + String pageSize = request.getParameter("pageSize"); + int intCurrentPage=1; + int intPageSize=10; + try { + intCurrentPage = Integer.parseInt(currentPage); + intPageSize = Integer.parseInt(pageSize); + } catch (NumberFormatException e) { + System.out.println(e); + } + if(intCurrentPage==0) + { + intCurrentPage=1; + } + int totalPage=totalCount%intPageSize==0?totalCount/intPageSize:(totalCount/intPageSize+1); + if (intCurrentPage>totalPage) + { + intCurrentPage=totalPage; + } + PageBean pageBean = service.getPageBean(intCurrentPage, intPageSize); + System.out.println(pageBean); + + ObjectMapper mapper=new ObjectMapper(); + response.setContentType("application/json;charset=utf-8"); + mapper.writeValue(response.getOutputStream(),pageBean); + + + } + + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException + { + + this.doPost(request, response); + + } +} diff --git a/src/src_houduan/web/servlet/waterQualityStation/FindIntroServlet.java b/src/src_houduan/web/servlet/waterQualityStation/FindIntroServlet.java new file mode 100644 index 0000000..d3cffc1 --- /dev/null +++ b/src/src_houduan/web/servlet/waterQualityStation/FindIntroServlet.java @@ -0,0 +1,38 @@ +package web.servlet.waterQualityStation; + +import com.fasterxml.jackson.databind.ObjectMapper; +import domain.WaterQualityStation; +import service.WaterQualityStationService; +import service.impl.WaterQualityStationServiceImpl; + +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +@WebServlet("/FindIntroServlet") +public class FindIntroServlet extends HttpServlet +{ + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException + { + String id = request.getParameter("id"); + int intId = Integer.parseInt(id); + System.out.println(intId); + + WaterQualityStationService service=new WaterQualityStationServiceImpl(); + WaterQualityStation station = service.findIntroById(intId); + ObjectMapper mapper=new ObjectMapper(); + response.setContentType("application/json;charset=utf-8"); + mapper.writeValue(response.getOutputStream(),station); + + } + + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException + { + + this.doPost(request, response); + + } +} diff --git a/src/src_houduan/web/servlet/waterQualityStation/FindLocationByNameServlet.java b/src/src_houduan/web/servlet/waterQualityStation/FindLocationByNameServlet.java new file mode 100644 index 0000000..0bf1013 --- /dev/null +++ b/src/src_houduan/web/servlet/waterQualityStation/FindLocationByNameServlet.java @@ -0,0 +1,36 @@ +package web.servlet.waterQualityStation; + +import com.fasterxml.jackson.databind.ObjectMapper; +import domain.WaterQualityStation; +import service.WaterQualityStationService; +import service.impl.WaterQualityStationServiceImpl; + +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +@WebServlet("/FindLocationByNameServlet") +public class FindLocationByNameServlet extends HttpServlet +{ + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException + { + request.setCharacterEncoding("utf-8"); + String stationName = request.getParameter("stationName"); + WaterQualityStationService service=new WaterQualityStationServiceImpl(); + WaterQualityStation station = service.findByName(stationName); + ObjectMapper mapper=new ObjectMapper(); + response.setContentType("application/json;charset=utf-8"); + mapper.writeValue(response.getOutputStream(),station); + + } + + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException + { + + this.doPost(request, response); + + } +} diff --git a/src/src_houduan/web/servlet/waterQualityStation/FindPollutedSiteServlet.java b/src/src_houduan/web/servlet/waterQualityStation/FindPollutedSiteServlet.java new file mode 100644 index 0000000..a4d9051 --- /dev/null +++ b/src/src_houduan/web/servlet/waterQualityStation/FindPollutedSiteServlet.java @@ -0,0 +1,39 @@ +package web.servlet.waterQualityStation; + +import com.fasterxml.jackson.databind.ObjectMapper; +import domain.WaterQualityStation; +import service.WaterQualityStationService; +import service.impl.WaterQualityStationServiceImpl; + +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.List; + +/** + * @author laoyingyong + * @date: 2020-02-01 22:29 + */ +@WebServlet("/FindPollutedSiteServlet") +public class FindPollutedSiteServlet extends HttpServlet +{ + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException + { + WaterQualityStationService service=new WaterQualityStationServiceImpl(); + List pollutedSite = service.findPollutedSite(); + ObjectMapper mapper=new ObjectMapper(); + response.setContentType("application/json;chartset=utf-8"); + mapper.writeValue(response.getOutputStream(),pollutedSite); + + } + + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException + { + + this.doPost(request, response); + + } +} diff --git a/src/src_houduan/web/servlet/waterQualityStation/FindSimIntroServlet.java b/src/src_houduan/web/servlet/waterQualityStation/FindSimIntroServlet.java new file mode 100644 index 0000000..2eb25ae --- /dev/null +++ b/src/src_houduan/web/servlet/waterQualityStation/FindSimIntroServlet.java @@ -0,0 +1,55 @@ +package web.servlet.waterQualityStation; + +import com.fasterxml.jackson.databind.ObjectMapper; +import domain.WaterQualityStation; +import service.WaterQualityStationService; +import service.impl.WaterQualityStationServiceImpl; + +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * @author laoyingyong + * @date: 2020-02-03 14:21 + */ +@WebServlet("/FindSimIntroServlet") +public class FindSimIntroServlet extends HttpServlet +{ + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException + { + String zuobiao = request.getParameter("zuobiao"); + System.out.println("坐标是:"+zuobiao); + String[] split = zuobiao.split(","); + String lo=split[0]; + String la=split[1]; + double longitude=0; + double latitude=0; + try + { + longitude=Double.parseDouble(lo); + latitude=Double.parseDouble(la); + } catch (NumberFormatException e) + { + System.out.println(e); + } + + WaterQualityStationService service=new WaterQualityStationServiceImpl(); + WaterQualityStation station = service.findIntro(longitude, latitude); + ObjectMapper mapper=new ObjectMapper(); + response.setContentType("application/json/chartset=utf-8"); + mapper.writeValue(response.getOutputStream(),station); + + + } + + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException + { + + this.doPost(request, response); + + } +} diff --git a/src/src_houduan/web/servlet/waterQualityStation/FindStationAndQualityServlet.java b/src/src_houduan/web/servlet/waterQualityStation/FindStationAndQualityServlet.java new file mode 100644 index 0000000..5cf651d --- /dev/null +++ b/src/src_houduan/web/servlet/waterQualityStation/FindStationAndQualityServlet.java @@ -0,0 +1,52 @@ +package web.servlet.waterQualityStation; + +import com.fasterxml.jackson.databind.ObjectMapper; +import domain.StationAndQuality; +import service.WaterQualityStationService; +import service.impl.WaterQualityStationServiceImpl; + +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * @author laoyingyong + * @date: 2020-02-03 17:07 + */ +@WebServlet("/FindStationAndQualityServlet") +public class FindStationAndQualityServlet extends HttpServlet +{ + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException + { + String lo = request.getParameter("jingdu"); + System.out.println("经度是:"+lo); + + String la = request.getParameter("weidu"); + System.out.println("纬度是:"+la); + double longitude=0; + double latitude=0; + try { + longitude=Double.parseDouble(lo); + latitude=Double.parseDouble(la); + } catch (NumberFormatException e) { + System.out.println(e); + } + + WaterQualityStationService service=new WaterQualityStationServiceImpl(); + StationAndQuality stationAndQuality = service.findStationAndQuality(longitude, latitude); + ObjectMapper mapper=new ObjectMapper(); + response.setContentType("application/json;chartset=utf-8"); + mapper.writeValue(response.getOutputStream(),stationAndQuality); + + } + + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException + { + + this.doPost(request, response); + + } +} diff --git a/src/src_houduan/web/servlet/waterQualityStation/IndexingServlet.java b/src/src_houduan/web/servlet/waterQualityStation/IndexingServlet.java new file mode 100644 index 0000000..0af58a8 --- /dev/null +++ b/src/src_houduan/web/servlet/waterQualityStation/IndexingServlet.java @@ -0,0 +1,39 @@ +package web.servlet.waterQualityStation; + +import com.fasterxml.jackson.databind.ObjectMapper; +import domain.StationAndQuality; +import service.WaterQualityStationService; +import service.impl.WaterQualityStationServiceImpl; + +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.List; + +/** + * @author laoyingyong + * @date: 2020-02-08 11:32 + */ +@WebServlet("/IndexingServlet") +public class IndexingServlet extends HttpServlet +{ + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException + { + WaterQualityStationService service=new WaterQualityStationServiceImpl(); + List list = service.indexing(); + ObjectMapper mapper=new ObjectMapper(); + response.setContentType("application/json;chartset-utf-8"); + mapper.writeValue(response.getOutputStream(),list); + + } + + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException + { + + this.doPost(request, response); + + } +} diff --git a/src/src_houduan/web/servlet/waterQualityStation/UpdateStationInfoServlet.java b/src/src_houduan/web/servlet/waterQualityStation/UpdateStationInfoServlet.java new file mode 100644 index 0000000..5960a71 --- /dev/null +++ b/src/src_houduan/web/servlet/waterQualityStation/UpdateStationInfoServlet.java @@ -0,0 +1,70 @@ +package web.servlet.waterQualityStation; + +import com.fasterxml.jackson.databind.ObjectMapper; +import domain.ResultInfo; +import domain.WaterQualityStation; +import service.WaterQualityStationService; +import service.impl.WaterQualityStationServiceImpl; + +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +@WebServlet("/UpdateStationInfoServlet") +public class UpdateStationInfoServlet extends HttpServlet +{ + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException + { + request.setCharacterEncoding("utf-8"); + String id = request.getParameter("id"); + String stationName = request.getParameter("stationName"); + String longitude = request.getParameter("longitude"); + System.out.println(longitude); + String latitude = request.getParameter("latitude"); + System.out.println(latitude); + String section = request.getParameter("section"); + String introduction = request.getParameter("introduction"); + + WaterQualityStation station=new WaterQualityStation(); + try + { + station.setId(Integer.parseInt(id)); + station.setStationName(stationName); + station.setLongitude(Double.parseDouble(longitude)); + station.setLatitude(Double.parseDouble(latitude)); + station.setSection(section); + station.setIntroduction(introduction); + } catch (Exception e) + { + System.out.println(e); + } + + + WaterQualityStationService service=new WaterQualityStationServiceImpl(); + boolean flag = service.update(station); + ResultInfo info=new ResultInfo(); + if(flag) + { + info.setMsg("更新成功!"); + } + else + { + info.setMsg("更新失败!"); + } + + ObjectMapper mapper=new ObjectMapper(); + response.setContentType("appilication/json;charset=utf-8"); + mapper.writeValue(response.getOutputStream(),info); + + } + + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException + { + + this.doPost(request, response); + + } +}