后端问题

Servlet

工件部署错误

image-20220404203402761

解决1:新建的表单没有为其指定对应的servle组件,/也没有加上。

解决2:在web.xml中与servlet类中同时定义了响应的数据

解决3:

感谢这位作者:servlet与filter的url-pattern设置方式及映射规则_qiaqia609的博客-CSDN博客

我们需要首先了解到tomcat的寻找地址的方式localhost://8080:+上下文+响应的文件

上下文在tomcat部署中查看image-20220407203658616

而我们访问地址,比如说http://localhost:8080/fruit/fruit.do,那么我们需要在servlet中进行响应的部件应该为**/fruit.do,否则会工件部署无效。**

网页报405错误

image-20220406162156305

网络上说时是调用了父类的doget方法,但是我重写的是dopost,而且仅仅使用了dopost方法,没有用到doget方法。

Servlet类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
package com.zss.servlets;

import com.zss.impl.FruitDAOImpl;
import com.zss.object.Fruit;

import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.List;
@WebServlet("/fruit/search")
public class SearchServlet extends ViewBaseServlet{
@Override
public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
req.setCharacterEncoding("UTF-8");
String pagePer=req.getParameter("pageSearchNo");
if (pagePer == null|pagePer==""){
pagePer="1";
}
int pageNum=Integer.parseInt(pagePer);
FruitDAOImpl fruitDAO=new FruitDAOImpl();
String searchInfor=req.getParameter("searchInfor");
Object []objects={pageNum,searchInfor};
List<Fruit> list=fruitDAO.searchFruit(new Fruit(),objects);
//定义最后一页页数
int lastPageNum=((fruitDAO.getColumn()-1)/5)+1;
//将变量临时保存到内存中
HttpSession session=req.getSession();
session.setAttribute("searchInfor",searchInfor);
session.setAttribute("lastSearchPage",lastPageNum);
session.setAttribute("pageSearchNo",pageNum);
session.setAttribute("fruitSearchList",list);
//会将此处的视图名称对应到物理名称
//逻辑视图名称 Fruitshow
//物理视图名称 =前文+逻辑视图名称+后文=/fruit/Fruitshow.html
super.processTemplate("fruit/Search",req,resp);
}
}

thymeleaf跳转方法

1
2
3
4
5
6
<td colspan="7">
<input type="button" value="首页" th:onclick=|page(${1})| th:disabled="${session.pageNo==1}">
<input type="button" value="下一页" th:onclick=|page(${session.pageNo+1})| th:disabled="${session.pageNo==session.lastPage}">
<input type="button" value="上一页" th:onclick=|page(${session.pageNo-1})| th:disabled="${session.pageNo==1}">
<input type="button" value="尾页" th:onclick=|page(${session.lastPage})| th:disabled="${session.pageNo==session.lastPage}">
</td>
1
2
3
4
//调用函数的犯法
function pageSearch(pageSearchNo){
window.location.href="fruit/search?pageSearchNo="+pageSearchNo
}

后来,我发现,在页面跳转的时候我没有为其指定条装方式,导致请求默认为doget方法,而该方法没有被重写,导致了错误

于是我重新在servlet中重写了doget方法,但是这样会有一个缺陷,同一个表单跳转的时候,只能给指定的按钮进行指定跳转方法,但是在thymeleaf中页面跳转无法使用,所以在重写一个doget,去调用都dopost

servlet判断空

1
2
3
4
String searchInfor=req.getParameter("searchInfor");
if (searchInfor==null|searchInfor==""){
searchInfor= (String) req.getAttribute("searchInfor");
}

在servlet获得的字符串null与“是不同的”

412错误

HTTP 412错误,(Precondition failed),是HTTP协议状态码的一种,表示“未满足前提条件”。如果服务器没有满足请求者在请求中设置的其中一个前提条件时就会返回此错误代码。

412错误一般是由于要查看的网页设置了先决条件,一般是网页中有一个或多个请求标题字段中具有先决条件,这些字段经服务器测试后被认为是”FALSE”。客户端为当前资源的meta信息(头文件字段数据)设置了先决条件,以便防止请求的方法被用于指定资源外的其他资源,因此该请求无法完成而出现的错误

上面的412知道了错误,又看到HTTP status Code 412 未满足前提条件的解决方法之一_走错路的程序员的博客-CSDN博客_响应码412,这一篇博客,将请求方法更改为get方法,这样就会改好了,但是当我将请求又改到post方法时,他竟然又可以进行了

先插个眼

Servlet打印两次

1
2
3
4
5
6
7
8
9
10
11
12
13
@WebServlet("/*.do")
public class DispatcherServlet extends ViewBaseServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
//如果说url是:http://localhost:8080/fruit/hello.do
//servletPath是: /fruit/hello.do
String servletPath=req.getServletPath();
System.out.println(servletPath);

System.out.println("我运行了一次");
}
}

以上的代码我仅仅默认在http://localhost:8080/fruit/hello.do网址中打开,但是这个方法尽然输出了两个,难道不是service方法仅仅运行了一次吗???

现在学习到SpringMVC,其实在这个启动的过程中,tomcat我们也设置了一次请求,所以会响应两次,如果tomcat请求中的打开时取消打开网页,其实service就是仅仅运行了一次

image-20220407191910546

500错误

image-20220510161226120

image-20220510161434656

在web.xml文件中,配置了中央控制器,却没有初始化springmvc的参数值,网页请求经过web.xml的分发之后,找不到了springmvc配置文件,于是去默认路径下寻找,默认路径也没有,会发生错误。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!--对所有的页面进行控制-->
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<!--//上下文配置路径-->
<param-name>contextConfigLocation</param-name>
<!--路径-->
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>

Tomcat

网页端报304问题

  • 2022年-4月-6日:tomcat服务器存在缓存存放在work工作夹的日志下面,将其删除即可

  • 2022年-4月-7日:今天使用thymeleaf进行跳转组合,又出现相同问题

不可跳转:

1
2
3
<form th:action="@{/fruit.do(operate='inquire')}"   method="get" >
<input type="submit" value="查询">
</form>

可以跳转:

1
2
3
<form action="/fruit.do?operate=inquire"   method="get" >
<input type="submit" value="查询">
</form>

因为它处在一个循环依赖关系中(artifact ‘SSM’, artifact ‘SSM:war exploded’)

无法构建 artifact ‘SSM’,因为它处在一个循环依赖关系中(artifact ‘SSM’, artifact ‘SSM:war exploded’)

artifact ‘SSM:war exploded属于可以热部署的部件,如果我们启动热部署,而原来的不去更改,会发生这中情况

idea tomcat部署web项目报错:Error:Cannot build artifact ‘xxx:war exploded‘ because it is included into 循环依赖_飞乐鸟的博客-CSDN博客_warexploded

数据库

java.sql.SQLException: Before start of result set

解决:使用rs.getString();前一定要加上rs.next();

Invalid argument value: java.io.NotSerializableException

参数传递错误,需要将参数进行转换之后在进行查询等操作

调度器dispatcher

调度器中无法使用parameter.getName()获得参数的实际名称

image-20220414210103167

其他错误

java.lang.InstantiationException

这种错误出现表示构造器出现问题了,但是我已经在其中定义了一个拥有三个参数的构造器

1
2
3
4
5
public CartItem(Book book, Integer buyCount, User userBean) {
this.book = book;
this.buyCount = buyCount;
this.userBean = userBean;
}

但是在后面dao层中调用时,参数类型转换,需要重新定义一个无参构造器,否则会发生错误。

1
T entity = (T)entityClass.newInstance();

SpringMVC

将请求打开页面

发送的delete请求,但是thymeleaf想要打开delete.html页面,

解决:如果不加上@ResponseBody,会将其解析成一个页面,而不是一个返回的数据。

https://blog.csdn.net/m0_48112568/article/details/116430574