Eclipse设置server的编码

Eclipse设置server的编码

最近在开发一些HTML5的界面,H5中界面的数据都是从服务器接口获取,而且我们从服务器获取数据时就涉及到跨域的问题,这样我们就不得不使用了JQuery中的jsonp get请求。http请求如果包含有中文参数,一般我们是通过post请求替代get请求来解决编码问题,但是很抱歉,jsonp 由于其原理的原因只能是get请求。所以对于包含有中文参数的get请求,就得对参数进行url编码,以解决中文编码的问题。如下:

var fullUrl = 'http://127.0.0.1:8080/getUserInfo'
var reqData ='{"userName":"中国"}';//有中文的参数
reqData = encodeURIComponent(reqData);//url encode utf-8
//封装完整的请求的url地址,str参数放请求的json数据
fullUrl = fullUrl + '?str=' + reqData + '&r=' + new Date().getTime();
console.log('jsonp get请求fullUrl:' + fullUrl);
//以下发出js请求
            $.ajax({
                type: "get",
                url: 'http://xxxx:8080/getUserI',
                timeout: 10000,
                dataType: "jsonp",
                jsonp: "jsoncallback",
                //jsonpCallback: "success_jsonpCallback",
                success: function(data) {
                    console.log("result: " + APP.json2Str(data));
                    if (data && data.result) {
                        if (data.result == '0') { //获取数据成功
                            callback_success(data);
                        } else {
                            var errerTips = '网络请求发生错误,请稍后再试';
                            //token异常
                            if (data.result == "002" || data.result == "003") {
                                APP.refreshAppToken(); //刷新token
                                errerTips = data.reason;
                            }
                            //
                            APP.showHttpErrer(errerTips);
                        }

                    }
                },
                complete: function(XMLHttpRequest, status) { //请求完成后最终执行参数
                    if (showLoadingDialog) {
                        APP.dismissLoadingDialog();
                    }
                    if (status == 'timeout') { //超时,status还有success,error等值的情况
                        APP.showHttpErrer('网络请求超时,请稍后再试');
                    } else if (status == 'error') {
                        APP.showHttpErrer('网络请求发生错误,请稍后再试');
                    } else if (status == 'success') {}  
                }
            });

很明显,上述get请求,我们已经使用encodeURIComponent对参数进行了编码,这样我们服务端servlet接收请求并解析参数时,无需额外的工作就能自动将参数解码。如下:

String  reqStr = req.getParameter("str");//可能str是中文,但是无需额外工作既会自己解码

以下说的就是我踩到的坑。我们的项目打包到阿里云的服务器或者我把项目打包放到本地的tomcat容器发布之后,从H5发出的get请求,就算有中文参数,服务端解析都不会乱码;但是我在eclipse中配置使用的tomcat运行项目,却总是乱码,这让我陷入了沉思,多次检查本地的tomcat已确认编码设置为UTF-8编码。按道理说,eclipse中运行的server依赖了本地tomcat,本地tomcat的编码已经已经在server.xml设置,为何不生效。经过多番折腾,原来才明白eclipse的server虽然依赖了本地tomcat环境,但是只是当做了一个运行的容器,而运行的server却引用了eclipse中server中配置的server.xml文件,并不是本地tomcat中的server.xml文件。
所以,我们找到eclipse中servers下面的server,修改里面的server.xml文件,最终编码问题得以解决:

这里写图片描述

记录一下这个坑,以免以后会重踩!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,我来回答你的问题。 首先,你需要在 Eclipse 中创建一个 Java Web 项目,并使用 JSP 和 Servlet 技术来实现保存文字和图片到 SQL Server 数据库的功能。 下面是实现步骤: 1. 创建数据库表 首先,你需要在 SQL Server 中创建一个表来存储文字和图片。表结构可以如下所示: ```sql CREATE TABLE [dbo].[TextAndImage]( [Id] [int] IDENTITY(1,1) NOT NULL, [Text] [nvarchar](max) NULL, [Image] [varbinary](max) NULL, CONSTRAINT [PK_TextAndImage] PRIMARY KEY CLUSTERED ([Id] ASC) ) ``` 在表中,`Id` 是主键,用于唯一标识每一条记录;`Text` 是文本内容;`Image` 是图片的二进制数据。 2. 创建 JSP 页面和 Servlet 在 Eclipse 中创建一个 JSP 页面,用于用户输入文本和上传图片。用户可以在表单中输入文本和选择图片文件,然后点击提交按钮将数据保存到数据库中。 在 JSP 页面中,你需要使用 `<form>` 标签来创建表单,并使用 `<input>` 标签来上传文件。代码示例如下: ```html <form action="saveTextAndImage" method="post" enctype="multipart/form-data"> <input type="text" name="text"> <input type="file" name="image"> <input type="submit" value="Save"> </form> ``` 在 JSP 页面中,`action` 属性指定了表单提交的 URL,`method` 属性指定了提交方式为 POST,`enctype` 属性指定了表单数据的编码方式为 `multipart/form-data`,以支持上传文件。 接下来,你需要创建一个 Servlet 来处理表单提交。在 Servlet 中,你需要获取用户输入的文本和图片文件,并将它们保存到数据库中。代码示例如下: ```java @WebServlet("/saveTextAndImage") @MultipartConfig public class SaveTextAndImageServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String text = request.getParameter("text"); Part imagePart = request.getPart("image"); byte[] imageBytes = IOUtils.toByteArray(imagePart.getInputStream()); Connection connection = null; PreparedStatement statement = null; try { connection = getConnection(); statement = connection.prepareStatement("INSERT INTO TextAndImage (Text, Image) VALUES (?, ?)"); statement.setString(1, text); statement.setBytes(2, imageBytes); statement.executeUpdate(); } catch (SQLException e) { throw new ServletException("Failed to save text and image", e); } finally { closeStatement(statement); closeConnection(connection); } response.sendRedirect("index.jsp"); } private Connection getConnection() throws SQLException { // TODO: Replace with your own database connection code return DriverManager.getConnection("jdbc:sqlserver://localhost:1433;databaseName=mydatabase", "username", "password"); } private void closeStatement(Statement statement) { if (statement != null) { try { statement.close(); } catch (SQLException e) { // Ignore } } } private void closeConnection(Connection connection) { if (connection != null) { try { connection.close(); } catch (SQLException e) { // Ignore } } } } ``` 在 Servlet 中,`@MultipartConfig` 注解指定了该 Servlet 支持上传文件。在 `doPost` 方法中,你可以通过 `request.getParameter` 方法获取用户输入的文本,通过 `request.getPart` 方法获取用户上传的图片文件,然后将它们保存到数据库中。 在以上代码中,`getConnection` 方法用于获取数据库连接,你需要将其替换为你自己的数据库连接代码。`closeStatement` 和 `closeConnection` 方法用于关闭数据库资源。 3. 显示保存的文字和图片 最后,你需要在 JSP 页面中显示保存的文字和图片。你可以使用 SQL 查询语句从数据库中获取保存的数据,然后将图片数据转换为 Base64 编码的字符串,并将其显示在页面上。代码示例如下: ```html <% Connection connection = null; PreparedStatement statement = null; ResultSet resultSet = null; try { connection = getConnection(); statement = connection.prepareStatement("SELECT * FROM TextAndImage"); resultSet = statement.executeQuery(); while (resultSet.next()) { String text = resultSet.getString("Text"); byte[] imageBytes = resultSet.getBytes("Image"); String imageBase64 = Base64.getEncoder().encodeToString(imageBytes); %> <div> <p><%=text%></p> <img src="data:image/jpeg;base64,<%=imageBase64%>" alt="Image"> </div> <% } } catch (SQLException e) { throw new ServletException("Failed to retrieve text and image", e); } finally { closeResultSet(resultSet); closeStatement(statement); closeConnection(connection); } %> ``` 在以上代码中,`getConnection`、`closeStatement` 和 `closeConnection` 方法与前面的代码相同。`resultSet` 变量用于保存查询结果集,你需要在最后使用 `closeResultSet` 方法关闭它。`text` 和 `imageBytes` 变量分别保存了文本内容和图片的二进制数据。`imageBase64` 变量将图片数据转换为 Base64 编码的字符串,用于在页面中显示图片。 希望这个回答对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值