初学tomcat和java web常见的配置和中文编码的问题

来源:互联网 发布:不翻墙上google 知乎 编辑:程序博客网 时间:2024/06/05 23:42

嗯,因为初学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");elseusername="我的朋友";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");