今天写了个servlet出现的几个问题记录一下。
下面所说不是servlet和jsp相互传递。
一共三个问题:
1、出现postman使用post请求传递json数据时,接收的数据全部为null。
2、代码执行完成,没有报错且数据成功插入数据库,但是浏览器却出现如下错误
(No ‘Access-Control-Allow-Origin’ header is present on the requested resource)
3、使用request.setAttribute向html返回信息,是根本传递不过数据的。
查了一下好像是因为request数据所保存的有效期只有一次请求。我们想要将数据传递出去,下面必须要转发到需要数据的页面才能把数据带过去吧。(个人见解只是猜的,大家还是自行查资料。)
问题一
下面先给上单独问题的解决办法,在给上全部代码。
第一个问题接收数据全部为null,这段代码是在网上找的一个大佬的。
大佬链接:https://www.aliyun.com/jiaocheng/772077.html
代码:
BufferedReader reader = new BufferedReader(new InputStreamReader(request.getInputStream(),"utf-8")); //将数据使用流进行传递
StringBuffer strb = new StringBuffer();
String line;
while ((line = reader.readLine()) != null) { //遍历数据
strb = strb.append(line); //数据暂存StringBuffer
}
HashMap map = JSONObject.parseObject(strb.toString(), HashMap.class);
// 使用阿里的fastjson jar包处理json数据(这里是用map进行接收的,你也可以定义vo层容器类接收)
String name = map.get("name").toString();
String email = map.get("email").toString();
String phone = map.get("phone").toString();
String demend = map.get("demend").toString();
好了这样就可以接收到参数了,说明一下我当时使用postman接收不到参数,但是前端调用时发现使用上面的方法接收不到数据,但是使用之前的request.getParameter(""); 却可以拿到数据……。暂且留下备用吧!
问题二
代码执行完成数据存入数据库且控制台并没有出现错误信息。但是浏览器出现了(No ‘Access-Control-Allow-Origin’ header is present on the requested resource)错误。说是跨域问题。
附大佬链接:https://blog.csdn.net/qq_39403545/article/details/82116121
这个代码等最后一起上。
问题三
使用request.setAttribute向html返回信息,传递不过去。
大佬链接:https://blog.csdn.net/yanghan1222/article/details/78447231
下面代码:
Gson gson = new Gson();
String str = gson.toJson(flag); //gson.toJson(flag); 将 flag转换为json字符串
response.setCharacterEncoding("UTF-8");
response.setContentType("application/json; charset=utf-8");
PrintWriter writer = response.getWriter(); //通过response获得一个输出流
writer.append(str);
下面上全部的代码了
@WebServlet("/Site")
public class Site extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/* BufferedReader reader = new BufferedReader(new InputStreamReader(request.getInputStream(),"utf-8"));
StringBuffer strb = new StringBuffer();
String line;
while ((line = reader.readLine()) != null) {
strb = strb.append(line);
}
HashMap map = JSONObject.parseObject(strb.toString(), HashMap.class);
String name = map.get("name").toString();
String email = map.get("email").toString();
String phone = map.get("phone").toString();
String demend = map.get("demend").toString();*/
//----------------------------------------上面被我注掉了,根据情况选择使用哪一种方法取值-----------------------------------------------------
String name = request.getParameter("name");
String email = request.getParameter("email");
String phone = request.getParameter("phone");
String demend = request.getParameter("demend");
boolean flag = false;
if(null != name || null != phone) {
String sql="INSERT INTO site_need(name,email,phone,demend,time)VALUES(?,?,?,?,?)";
Connection conn=null;
PreparedStatement ps=null;
try {
conn=ConnUtil.getConnection();
ps=conn.prepareStatement(sql);
ps.setString(1,name);
ps.setString(2,email);
ps.setString(3, phone);
ps.setString(4,demend);
ps.setTimestamp(5, new Timestamp(System.currentTimeMillis()));
ps.executeUpdate();
flag = true;
} catch (Exception e) {
e.printStackTrace();
}finally{
ConnUtil.closeConnection(ps, conn);
}
}
Gson gson = new Gson();
String str = gson.toJson(flag);
response.setCharacterEncoding("UTF-8");
response.setContentType("application/json; charset=utf-8");
PrintWriter writer = response.getWriter();
writer.append(str);
}
}
请求头过滤代码(这个就是问题二的代码)
public class CorsFilter implements Filter {
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse) servletResponse;
HttpServletRequest request = (HttpServletRequest)servletRequest;
String origin = request.getHeader("Origin");
response.setHeader("Access-Control-Allow-Origin", origin);
response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers", "x-requested-with,Authorization");
response.setHeader("Access-Control-Allow-Credentials", "true");
String method = request.getMethod();
if(method.equalsIgnoreCase("OPTIONS")){
servletResponse.getOutputStream().write("Success".getBytes("utf-8"));
}else{
filterChain.doFilter(servletRequest, servletResponse);
}
}
@Override
public void init(FilterConfig arg0) throws ServletException {
}
}
web.xml (问题二需要配置filter)
<filter>
<filter-name>corsFilter</filter-name>
<filter-class>net.qhkj.site.util.CorsFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>corsFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>site</servlet-name>
<servlet-class>net.qhkj.site.controller.Site</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>site</servlet-name>
<url-pattern>/site</url-pattern>
</servlet-mapping>