当前位置:   article > 正文

servlet入门-获取参数_servletutils.getparameter获取参数重新赋值

servletutils.getparameter获取参数重新赋值

servlet入门-获取参数

  • web容器(tomcat:web应用服务器软件)中可以有多个servlet对象

  • 每个Servlet在Tomcat容器中只有一个实例,它是线程不安全的

遇到过的问题总结

  1. 1. 新建项目 - 新建模块
  2. 2. 在模块中添加web
  3. 3. 创建artifact - 部署包
  4. 4. lib - artifact
  5. 先有artifact,后来才添加的mysql.jar。此时,这个jar包并没有添加到部署包中
  6. 那么在projectSettings中有一个Problems中会有提示的,我们点击fix选择add to...
  7. 另外,我们也可以直接把lib文件夹直接新建在WEB-INF下。
  8. 这样不好的地方是这个lib只能是当前这个moudle独享。如果有第二个moudle我们需要再次重复的新建lib。
  9. 5. 在部署的时候,修改application Context。然后再回到server选项卡,检查URL的值。
  10. URL的值指的是tomcat启动完成后自动打开你指定的浏览器,然后默认访问的网址。
  11. 启动后,报错404.404意味着找不到指定的资源。
  12. 如果我们的网址是:http://localhost:8080/pro01/ , 那么表明我们默认访问的是index.html.
  13. 我们可以通过<welcome-file-list>标签进行设置欢迎页(在tomcat的web.xml中设置,或者在自己项目的web.xml中设置)
  14. 6. 405问题。当前请求的方法不支持。比如,我们表单method=post , 那么Servlet必须对应doPost。否则报405错误。
  15. 7. 空指针或者是NumberFormatException 。因为有价格和库存。如果价格取不到,结果你想对null进行Integer.parseInt()就会报错。错误的原因大部分是因为 name="price"此处写错了,结果在Servlet端还是使用request.getParameter("price")去获取。
  16. 8. <url-pattern>中以斜杠开头
  17. 9.404:找不到对应的资源

快捷键:变量名.soutv

add.html

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. <form action="add" method="post">
  9. 名称:<input type="text" name="fname" /><br>
  10. 价格:<input type="text" name="price" /><br>
  11. 库存:<input type="text" name="fcount" /><br>
  12. 备注:<input type="text" name="remark" /><br>
  13. <input type="submit" value="添加"/>
  14. </form>
  15. </body>
  16. </html>

web.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
  5. version="4.0">
  6. <servlet>
  7. <servlet-name>AddServlet</servlet-name>
  8. <servlet-class>com.atguigu.servlets.AddServlet</servlet-class>
  9. </servlet>
  10. <servlet-mapping>
  11. <servlet-name>AddServlet</servlet-name>
  12. <url-pattern>/add</url-pattern>
  13. </servlet-mapping>
  14. <!--
  15. 1.用户发请求,action = add
  16. 2.在项目中的web.xml中找到url-pattern = /add -> 第12行
  17. 3.找第11行的servlet-name = AddServlet
  18. 4.找和servlet-mapping中的servlet-name一致的servlet,找到第7行
  19. 5.找第8行的servlet-class -> com.atguigu.servlets.AddServlet
  20. 6.用户发送的是post请求(method = post),因此tomcat会执行AddServlet中的doPost方法
  21. -->
  22. </web-app>

Addservlet

  1. public class AddServlet extends HttpServlet {
  2. @Override
  3. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  4. String fname = request.getParameter("fname");
  5. String priceStr = request.getParameter("price");
  6. Integer price = Integer.parseInt(priceStr);
  7. String fcountStr = request.getParameter("fcount");
  8. Integer fcount = Integer.parseInt(fcountStr);
  9. String remark = request.getParameter("remark");
  10. FruitDAO fruitDAO = new FruitDAOImpl();
  11. boolean flag = fruitDAO.addFruit(new Fruit(0,fname,price,fcount,remark));
  12. System.out.println(flag ? "添加成功!":"添加失败!");
  13. }
  14. }

BaseDAO类

  1. public abstract class BaseDAO<T> {
  2. public final String DRIVER = "com.mysql.jdbc.Driver" ;
  3. public final String URL = "jdbc:mysql://localhost:3306/fruitdb?useUnicode=true&characterEncoding=utf-8&useSSL=false";
  4. public final String USER = "root";
  5. public final String PWD = "123456";
  6. protected Connection conn ;
  7. protected PreparedStatement psmt ;
  8. protected ResultSet rs ;
  9. //T的Class对象
  10. private Class entityClass ;
  11. public BaseDAO(){
  12. //getClass() 获取Class对象,当前我们执行的是new FruitDAOImpl() , 创建的是FruitDAOImpl的实例
  13. //那么子类构造方法内部首先会调用父类(BaseDAO)的无参构造方法
  14. //因此此处的getClass()会被执行,但是getClass获取的是FruitDAOImpl的Class
  15. //所以getGenericSuperclass()获取到的是BaseDAO的Class
  16. Type genericType = getClass().getGenericSuperclass();
  17. //ParameterizedType 参数化类型
  18. Type[] actualTypeArguments = ((ParameterizedType) genericType).getActualTypeArguments();
  19. //获取到的<T>中的T的真实的类型
  20. Type actualType = actualTypeArguments[0];
  21. try {
  22. entityClass = Class.forName(actualType.getTypeName());
  23. } catch (ClassNotFoundException e) {
  24. e.printStackTrace();
  25. }
  26. }
  27. //获取连接
  28. protected Connection getConn(){
  29. try {
  30. //1.加载驱动
  31. Class.forName(DRIVER);
  32. //2.通过驱动管理器获取连接对象
  33. return DriverManager.getConnection(URL, USER, PWD);
  34. } catch (ClassNotFoundException | SQLException e) {
  35. e.printStackTrace();
  36. }
  37. return null ;
  38. }
  39. protected void close(ResultSet rs , PreparedStatement psmt , Connection conn){
  40. try {
  41. if (rs != null) {
  42. rs.close();
  43. }
  44. if(psmt!=null){
  45. psmt.close();
  46. }
  47. if(conn!=null && !conn.isClosed()){
  48. conn.close();
  49. }
  50. } catch (SQLException e) {
  51. e.printStackTrace();
  52. }
  53. }
  54. //给sql语句中的占位符传值
  55. private void setParams(PreparedStatement psmt , Object... params) throws SQLException {
  56. if(params!=null && params.length>0){
  57. for (int i = 0; i < params.length; i++) {
  58. psmt.setObject(i+1,params[i]);
  59. }
  60. }
  61. }
  62. //执行更新,返回影响行数
  63. protected int executeUpdate(String sql , Object... params){
  64. boolean insertFlag = false ;
  65. insertFlag = sql.trim().toUpperCase().startsWith("INSERT");
  66. try {
  67. conn = getConn();
  68. if(insertFlag){
  69. psmt = conn.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS);
  70. }else {
  71. psmt = conn.prepareStatement(sql);
  72. }
  73. setParams(psmt,params);
  74. int count = psmt.executeUpdate() ;
  75. if(insertFlag){
  76. rs = psmt.getGeneratedKeys();
  77. if(rs.next()){
  78. return ((Long)rs.getLong(1)).intValue();
  79. }
  80. }
  81. return count ;
  82. } catch (SQLException e) {
  83. e.printStackTrace();
  84. }finally {
  85. close(rs,psmt,conn);
  86. }
  87. return 0;
  88. }
  89. //通过反射技术给obj对象的property属性赋propertyValue值
  90. private void setValue(Object obj , String property , Object propertyValue){
  91. Class clazz = obj.getClass();
  92. try {
  93. //获取property这个字符串对应的属性名 , 比如 "fid" 去找 obj对象中的 fid 属性
  94. Field field = clazz.getDeclaredField(property);
  95. if(field!=null){
  96. field.setAccessible(true);
  97. field.set(obj,propertyValue);
  98. }
  99. } catch (NoSuchFieldException | IllegalAccessException e) {
  100. e.printStackTrace();
  101. }
  102. }
  103. //执行复杂查询,返回例如统计结果
  104. protected Object[] executeComplexQuery(String sql , Object... params){
  105. try {
  106. conn = getConn() ;
  107. psmt = conn.prepareStatement(sql);
  108. setParams(psmt,params);
  109. rs = psmt.executeQuery();
  110. //通过rs可以获取结果集的元数据
  111. //元数据:描述结果集数据的数据 , 简单讲,就是这个结果集有哪些列,什么类型等等
  112. ResultSetMetaData rsmd = rs.getMetaData();
  113. //获取结果集的列数
  114. int columnCount = rsmd.getColumnCount();
  115. Object[] columnValueArr = new Object[columnCount];
  116. //6.解析rs
  117. if(rs.next()){
  118. for(int i = 0 ; i<columnCount;i++){
  119. Object columnValue = rs.getObject(i+1); //33 苹果 5
  120. columnValueArr[i]=columnValue;
  121. }
  122. return columnValueArr ;
  123. }
  124. } catch (SQLException e) {
  125. e.printStackTrace();
  126. } finally {
  127. close(rs,psmt,conn);
  128. }
  129. return null ;
  130. }
  131. //执行查询,返回单个实体对象
  132. protected T load(String sql , Object... params){
  133. try {
  134. conn = getConn() ;
  135. psmt = conn.prepareStatement(sql);
  136. setParams(psmt,params);
  137. rs = psmt.executeQuery();
  138. //通过rs可以获取结果集的元数据
  139. //元数据:描述结果集数据的数据 , 简单讲,就是这个结果集有哪些列,什么类型等等
  140. ResultSetMetaData rsmd = rs.getMetaData();
  141. //获取结果集的列数
  142. int columnCount = rsmd.getColumnCount();
  143. //6.解析rs
  144. if(rs.next()){
  145. T entity = (T)entityClass.newInstance();
  146. for(int i = 0 ; i<columnCount;i++){
  147. String columnName = rsmd.getColumnName(i+1); //fid fname price
  148. Object columnValue = rs.getObject(i+1); //33 苹果 5
  149. setValue(entity,columnName,columnValue);
  150. }
  151. return entity ;
  152. }
  153. } catch (SQLException e) {
  154. e.printStackTrace();
  155. } catch (IllegalAccessException e) {
  156. e.printStackTrace();
  157. } catch (InstantiationException e) {
  158. e.printStackTrace();
  159. } finally {
  160. close(rs,psmt,conn);
  161. }
  162. return null ;
  163. }
  164. //执行查询,返回List
  165. protected List<T> executeQuery(String sql , Object... params){
  166. List<T> list = new ArrayList<>();
  167. try {
  168. conn = getConn() ;
  169. psmt = conn.prepareStatement(sql);
  170. setParams(psmt,params);
  171. rs = psmt.executeQuery();
  172. //通过rs可以获取结果集的元数据
  173. //元数据:描述结果集数据的数据 , 简单讲,就是这个结果集有哪些列,什么类型等等
  174. ResultSetMetaData rsmd = rs.getMetaData();
  175. //获取结果集的列数
  176. int columnCount = rsmd.getColumnCount();
  177. //6.解析rs
  178. while(rs.next()){
  179. T entity = (T)entityClass.newInstance();
  180. for(int i = 0 ; i<columnCount;i++){
  181. String columnName = rsmd.getColumnName(i+1); //fid fname price
  182. Object columnValue = rs.getObject(i+1); //33 苹果 5
  183. setValue(entity,columnName,columnValue);
  184. }
  185. list.add(entity);
  186. }
  187. } catch (SQLException e) {
  188. e.printStackTrace();
  189. } catch (IllegalAccessException e) {
  190. e.printStackTrace();
  191. } catch (InstantiationException e) {
  192. e.printStackTrace();
  193. } finally {
  194. close(rs,psmt,conn);
  195. }
  196. return list ;
  197. }
  198. }

FruitDAO 类

  1. public interface FruitDAO {
  2. //查询库存列表
  3. List<Fruit> getFruitList();
  4. //新增库存
  5. boolean addFruit(Fruit fruit);
  6. //修改库存
  7. boolean updateFruit(Fruit fruit);
  8. //根据名称查询特定库存
  9. Fruit getFruitByFname(String fname);
  10. //删除特定库存记录
  11. boolean delFruit(String fname);
  12. }

FruitDAOImpl

  1. public class FruitDAOImpl extends BaseDAO<Fruit> implements FruitDAO {
  2. //查询库存列表
  3. @Override
  4. public List<Fruit> getFruitList() {
  5. return super.executeQuery("select * from t_fruit");
  6. }
  7. //新增库存
  8. @Override
  9. public boolean addFruit(Fruit fruit) {
  10. String sql = "insert into t_fruit values(0,?,?,?,?)";
  11. int count = super.executeUpdate(sql,fruit.getFname(),fruit.getPrice(),fruit.getFcount(),fruit.getRemark()) ;
  12. //insert语句返回的是自增列的值,而不是影响行数
  13. //System.out.prin tln(count);
  14. return count>0;
  15. }
  16. //修改库存
  17. @Override
  18. public boolean updateFruit(Fruit fruit) {
  19. String sql = "update t_fruit set fcount = ? where fid = ? " ;
  20. return super.executeUpdate(sql,fruit.getFcount(),fruit.getFid())>0;
  21. }
  22. //根据名称查询特定库存
  23. @Override
  24. public Fruit getFruitByFname(String fname) {
  25. return super.load("select * from t_fruit where fname like ? ",fname);
  26. }
  27. //删除特定库存记录
  28. @Override
  29. public boolean delFruit(String fname) {
  30. String sql = "delete from t_fruit where fname like ? " ;
  31. return super.executeUpdate(sql,fname)>0;
  32. }
  33. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/309877
推荐阅读
相关标签
  

闽ICP备14008679号