嗯,因为初学web应用这方面的东西,很多同学都问了我很多比较相似的问题,有很多我自己之前也碰到过,所以将这些高发的问题整理如下(我也是刚学难免说的有些不对的地方见谅,然后就是由于软件版本问题有些解决方法可能不适用,呐):
1、登录tomcat manager
首先,我建议先学会登录上tomcat manager,嗯.......是这么叫吧
先找到这么一个文件,它在tomcat根目录下的conf目录,名字叫tomcat-user.xml
<tomcat-users>
<role rolename="manager-gui"/>
<user username="tomcat" password="123" roles="manager-gui"/>
<!--
NOTE: By default, no user is included in the "manager-gui" role required
to operate the "/manager/html" web application. If you wish to use this app,
you must define such a user - the username and password are arbitrary.
-->
<!--
NOTE: The sample user and role entries below are wrapped in a comment
and thus are ignored when reading this file. Do not forget to remove
<!.. ..> that surrounds them.
-->
<!--
<role rolename="tomcat"/>
<role rolename="role1"/>
<user username="tomcat" password="tomcat" roles="tomcat"/>
<user username="both" password="tomcat" roles="tomcat,role1"/>
<user username="role1" password="tomcat" roles="role1"/>
-->
</tomcat-users>
嗯,网上有些方法是把下面注释掉的一坨东西去掉注视,但是这个方法貌似不太行,用这个方法登录tomcat manager会出现一个403的页面貌似,然后它内容中有教你用另一种方法,嗯,这些内容要好好关注,不要习惯性忽略。就是像我上面代码中的那样,添加一个manager-gui。基本上这样就可以了,保存,千万别忘记重启tomcat,这个很重要!!!
之后就在你的浏览器中输入localhost:8080/manager输入刚才设定的帐号密码就可以进入管理页面了
为什么说这个呢,我单纯认为这个比较方便的,直接对你修改过的项目reload
如果不行的话可以试试localhost:8080/manager/html
2.配置一个简单的servlet
以这样一个最基本的为例子
点击submit提交表单,响应的页面是,你好,xxx。
表单页面的主要代码如下:
<form name="loginForm" method="get" action="/helloapp2/hello">
<table>
<tr>
<td><div align="right">User Name:</div></td>
<td><input type="text" name="username"></td>
</tr>
<tr>
<td><div align="right">Password:</div></td>
<td><input type="password" name="password"></td>
</tr>
<tr>
<td><input type="submit" name="submit" value="submit"></td>
<td><input type="reset" name="reset" value="reset"></td>
</tr>
</table>
先请注意下action中的值,"helloapp2"是我这个webapp的名字
下面是处理这个请求的HelloServlet
package mypack;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
public class HelloServlet extends HttpServlet
{
public void doGet(HttpServletRequest request,HttpServletResponse response)
throws ServletException,IOException
{
String username=request.getParameter("username");
if(username!=null)
username=new String(username.getBytes("ISO-8859-1"),"UTF-8");
else
username="我的朋友";
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("<html><head><title>HelloServlet</TITLE></head>");
out.println("<body>");
out.println("你好: "+username);
out.println("</body></html>");
out.close(); //关闭PrintWriter
}
}
注:千万不要忘记out.close()这句话,不然也会出现404的错误貌似
下面是web.xml的配置
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>mypack.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
简单说下流程吧(我理解的= =):提交表单的时候,根据action中的值来搜寻对应的处理请求的servlet,比如这个是“/hello",然后对应的servlet-name是HelloServlet,在<servlet>中找到和它名字一样叫HelloServlet的,对应到它的servlet-class,也就是上面的HelloSerlet.java,mypack是包名,也不要漏了。
那么既然这边是"/hello"为什么在表单的页面提交的action是"/helloapp2/hello"呢?
我们先把action改成"/hello"看看效果:
可以发现,action中的"/hello"是直接跟在主机名字的后面,而并没有进入应用中,也就是/helloapp2中,这样自然是找不见文件的
而正确的就像这样:
3.中文乱码
这个问题很常见,而且有很多奇奇怪怪的出错方法,我就列举下我见过的,和其解决的方法
先提几点小小的建议:
(1)大家还是统一使用UTF-8,这个还是比较主流的,可能很多教材或IDE中自动生成的都是GB2312,那就改掉它,因为现在很多浏览器默认的是UTF-8的编码,我刚学的时候折腾了很长时间,发现,就我自己装的这几个浏览器,如果是GB2312,IE可以正常显示,其它浏览器是乱码,UTF-8呢,IE是乱码,其它都正常。当然浏览器什么的都可以改设置就没问题了,但是一般初学都不是很知道,所以大家遇到错误的时候试试切换多个浏览器,看看到底是哪方面的问题。
(2)嗯,很多IDE在新建一个文件,如HTML或者servlet什么的时候会自带模版的,比如我在myEclipse中新建一个jsp:
喔吼~都是什么跟什么啊。这个时候千万要小心,一般会很容易写重复的,比如<%@page %>这类的,还有忘记改什么的
我一般就是,全部删掉,碍事
刚开始学嘛,就不要偷懒,练练手
那么下面是几个需要注意的地方,可能一个环节不对就回乱码
(1)html文件的头部,页面的编码
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>无标题文档</title>
</head>
(2)servlet中
这是响应页面的编码
response.setContentType("text/html;charset=UTF-8");
这些是传递参数时的编码问题
下面这里需要注意了,一般来说是要这样做的,tomcat默认的编码格式是ISO-8859-1,这里是将它转换成UTF-8
String username=request.getParameter("username");
username=new String(username.getBytes("ISO-8859-1"),"UTF-8");
如果你之前在serve.xml上改成如下情况,那么前面就多此一举了,会乱码
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
URIEncoding="utf-8" />
这里就将默认的URI编码改成了UTF-8,注意这里是URI!就是你在浏览器输入网址那一栏的东西,也就是和doGet方法相关的,对doPost无用。
所以想要偷懒的话就用第二种方法,修改xml文件,这样的话,doGet编码的问题应该解决了。
总之的,要注意编码解码什么千万不要方法重了,追求简单到极致。
下面是doPost的方法。
当然这样也是行的,但是呢......doPost东西一般是比较多的,一个个这样弄,略麻烦的
String username=request.getParameter("username");
username=new String(username.getBytes("ISO-8859-1"),"UTF-8");
所以可以用这句话
request.setCharacterEncoding("UTF-8");
嗯,直接把所有内容的编码都解决了,注意这对于doGet传递进来的参数是没有用的,是专门对请求正文进行编码的,而post方法递交的参数就是在请求正文里的
(3)jsp文件中
<%@ page contentType="text/html;charset=UTF-8" %>
<HTML>
<BODY>
<% request.setCharacterEncoding("UTF-8"); %>
<% String name=request.getParameter("name");
String brief=request.getParameter("brief");
String gender=request.getParameter("gender");
String grade=request.getParameter("grade");
String interest1=request.getParameter("interest1");
;%>
<table align="center" border="2">
<tr>
<td>姓名:</td>
<td><%=name %></td>
</tr>
<tr>
<td>性别:</td>
<td><%=gender %></td>
</tr>
<tr>
<td>年级:</td>
<td><%=grade %></td>
</tr>
<tr>
<td>兴趣:</td>
<td><%=interest1%></td>
</tr>
<tr>
<td>个人简介</td>
<td><%=brief %></td>
</tr>
</table>
</BODY>
</HTML>
关键的就是这两句
页面的编码
<%@ page contentType="text/html;charset=UTF-8" %>
<% request.setCharacterEncoding("UTF-8"); %>
如果要是get的方法,在之前serve.xml文件修改过之后,那么只需要这么一句就行了
<%@ page contentType="text/html;charset=UTF-8" %>
否则还是要添加这样的
String username=request.getParameter("username");
username=new String(username.getBytes("ISO-8859-1"),"UTF-8");